use llmsdk_provider::language_model::{ProviderTool, Tool};
use serde::Serialize;
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct XSearchOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_x_handles: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub excluded_x_handles: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub to_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_image_understanding: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enable_video_understanding: Option<bool>,
}
#[must_use]
pub fn x_search(opts: &XSearchOptions) -> Tool {
let args = serde_json::to_value(opts)
.ok()
.and_then(|v| v.as_object().cloned());
Tool::Provider(ProviderTool {
id: "xai.x_search".into(),
name: "x_search".into(),
args,
provider_options: None,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_date_emits_camel_case() {
let Tool::Provider(p) = x_search(&XSearchOptions {
from_date: Some("2020-01-01".into()),
enable_video_understanding: Some(true),
..Default::default()
}) else {
panic!("expected provider tool");
};
let args = p.args.unwrap();
assert_eq!(args["fromDate"], "2020-01-01");
assert_eq!(args["enableVideoUnderstanding"], true);
}
}