use crate::{Embed, tool::PortableToolEmbedding};
use serde::Serialize;
use super::embed::EmbedError;
#[derive(Clone, Serialize, Default, Eq, PartialEq)]
pub struct ToolSchema {
pub name: String,
pub context: serde_json::Value,
pub embedding_docs: Vec<String>,
}
impl Embed for ToolSchema {
fn embed(&self, embedder: &mut super::embed::TextEmbedder) -> Result<(), EmbedError> {
for doc in &self.embedding_docs {
embedder.embed(doc.clone());
}
Ok(())
}
}
impl ToolSchema {
pub fn try_from<T>(tool: &T) -> Result<Self, EmbedError>
where
T: PortableToolEmbedding,
{
Ok(ToolSchema {
name: T::NAME.to_string(),
context: serde_json::to_value(tool.context()).map_err(EmbedError::new)?,
embedding_docs: tool.embedding_docs(),
})
}
}