rs_utcp/tools/
mod.rs

1use anyhow::Result;
2use async_trait::async_trait;
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// Minimal JSON Schema-like description for tool inputs/outputs.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct ToolInputOutputSchema {
9    #[serde(rename = "type")]
10    pub type_: String,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub properties: Option<HashMap<String, serde_json::Value>>,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub required: Option<Vec<String>>,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub description: Option<String>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub title: Option<String>,
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub items: Option<HashMap<String, serde_json::Value>>,
21    #[serde(rename = "enum", skip_serializing_if = "Option::is_none")]
22    pub enum_: Option<Vec<serde_json::Value>>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub minimum: Option<f64>,
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub maximum: Option<f64>,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub format: Option<String>,
29}
30
31/// Canonical tool definition used by UTCP transports and repositories.
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct Tool {
34    pub name: String,
35    pub description: String,
36    pub inputs: ToolInputOutputSchema,
37    pub outputs: ToolInputOutputSchema,
38    pub tags: Vec<String>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub average_response_size: Option<i64>,
41    #[serde(rename = "tool_provider", skip_serializing_if = "Option::is_none")]
42    pub provider: Option<serde_json::Value>,
43}
44
45/// Strategy abstraction used to search tools by query string.
46#[async_trait]
47pub trait ToolSearchStrategy: Send + Sync {
48    /// Return tools matching the query string, limited to `limit` results when non-zero.
49    async fn search_tools(&self, query: &str, limit: usize) -> Result<Vec<Tool>>;
50}