1use anyhow::Result;
2use async_trait::async_trait;
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[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#[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#[async_trait]
47pub trait ToolSearchStrategy: Send + Sync {
48 async fn search_tools(&self, query: &str, limit: usize) -> Result<Vec<Tool>>;
50}