Introduce LanguageModelToolUse::raw_input (#29322)

This is to enable alternative streaming solutions at the application
layer. I'm not sure we really should have performed parsing of the input
at this layer. Either way I want to experiment with streaming approaches
in a separate crate on a branch, and this will help.

/cc @maxdeviant @bennetbo @rtfeldman

Closes #ISSUE

Release Notes:

- N/A
This commit is contained in:
Nathan Sobo 2025-04-23 20:30:48 -06:00 committed by GitHub
parent f125353b6f
commit 8836c6fb42
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 13 additions and 0 deletions

View file

@ -72,6 +72,7 @@ impl ToolUseState {
.map(|tool_use| LanguageModelToolUse { .map(|tool_use| LanguageModelToolUse {
id: tool_use.id.clone(), id: tool_use.id.clone(),
name: tool_use.name.clone().into(), name: tool_use.name.clone().into(),
raw_input: tool_use.input.to_string(),
input: tool_use.input.clone(), input: tool_use.input.clone(),
is_input_complete: true, is_input_complete: true,
}) })

View file

@ -338,6 +338,7 @@ pub struct CountTokensResponse {
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct FunctionCall { pub struct FunctionCall {
pub name: String, pub name: String,
pub raw_args: String,
pub args: serde_json::Value, pub args: serde_json::Value,
} }

View file

@ -186,6 +186,7 @@ where
pub struct LanguageModelToolUse { pub struct LanguageModelToolUse {
pub id: LanguageModelToolUseId, pub id: LanguageModelToolUseId,
pub name: Arc<str>, pub name: Arc<str>,
pub raw_input: String,
pub input: serde_json::Value, pub input: serde_json::Value,
pub is_input_complete: bool, pub is_input_complete: bool,
} }

View file

@ -727,6 +727,7 @@ pub fn map_to_language_model_completion_events(
id: tool_use.id.clone().into(), id: tool_use.id.clone().into(),
name: tool_use.name.clone().into(), name: tool_use.name.clone().into(),
is_input_complete: false, is_input_complete: false,
raw_input: tool_use.input_json.clone(),
input, input,
}, },
))], ))],
@ -757,6 +758,7 @@ pub fn map_to_language_model_completion_events(
) )
.map_err(|err| anyhow!("Error parsing tool call input JSON: {err:?} - JSON string was: {input_json:?}"))? .map_err(|err| anyhow!("Error parsing tool call input JSON: {err:?} - JSON string was: {input_json:?}"))?
}, },
raw_input: tool_use.input_json.clone(),
}, },
)) ))
})], })],

View file

@ -894,6 +894,7 @@ pub fn map_to_language_model_completion_events(
id: tool_use.id.into(), id: tool_use.id.into(),
name: tool_use.name.into(), name: tool_use.name.into(),
is_input_complete: true, is_input_complete: true,
raw_input: tool_use.input_json.clone(),
input: if tool_use.input_json.is_empty() { input: if tool_use.input_json.is_empty() {
Value::Null Value::Null
} else { } else {

View file

@ -368,6 +368,7 @@ pub fn map_to_language_model_completion_events(
id: tool_call.id.into(), id: tool_call.id.into(),
name: tool_call.name.as_str().into(), name: tool_call.name.as_str().into(),
is_input_complete: true, is_input_complete: true,
raw_input: tool_call.arguments.clone(),
input: serde_json::Value::from_str( input: serde_json::Value::from_str(
&tool_call.arguments, &tool_call.arguments,
)?, )?,

View file

@ -396,6 +396,7 @@ pub fn into_google(
Some(Part::FunctionCallPart(google_ai::FunctionCallPart { Some(Part::FunctionCallPart(google_ai::FunctionCallPart {
function_call: google_ai::FunctionCall { function_call: google_ai::FunctionCall {
name: tool_use.name.to_string(), name: tool_use.name.to_string(),
raw_args: tool_use.raw_input,
args: tool_use.input, args: tool_use.input,
}, },
})) }))
@ -537,6 +538,10 @@ pub fn map_to_language_model_completion_events(
id, id,
name, name,
is_input_complete: true, is_input_complete: true,
raw_input: function_call_part
.function_call
.raw_args
.clone(),
input: function_call_part.function_call.args, input: function_call_part.function_call.args,
}, },
))); )));

View file

@ -491,6 +491,7 @@ pub fn map_to_language_model_completion_events(
id: tool_call.id.into(), id: tool_call.id.into(),
name: tool_call.name.as_str().into(), name: tool_call.name.as_str().into(),
is_input_complete: true, is_input_complete: true,
raw_input: tool_call.arguments.clone(),
input: serde_json::Value::from_str( input: serde_json::Value::from_str(
&tool_call.arguments, &tool_call.arguments,
)?, )?,