use std::fmt::Debug;
use mediawiki::api::Api;
use sapiens::tools::{Describe, ProtoToolDescribe, ProtoToolInvoke, ToolDescription, ToolUseError};
use sapiens_derive::{Describe, ProtoToolDescribe, ProtoToolInvoke};
use serde::{Deserialize, Serialize};
use serde_json;
#[derive(ProtoToolInvoke, ProtoToolDescribe)]
#[tool(
name = "Wikidata",
input = "WikidataToolInput",
output = "WikidataToolOutput"
)]
pub struct WikidataTool {
client: Api,
}
impl Debug for WikidataTool {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("WikidataTool").finish()
}
}
#[derive(Debug, Deserialize, Serialize, Describe)]
pub struct WikidataToolInput {
query: String,
}
#[derive(Debug, Deserialize, Serialize, Describe)]
pub struct WikidataToolOutput {
result: String,
}
impl WikidataTool {
pub async fn new() -> Self {
let client = Api::new("https://www.wikidata.org/w/api.php")
.await
.unwrap();
Self { client }
}
#[tracing::instrument(skip(self))]
async fn invoke_typed(
&self,
input: &WikidataToolInput,
) -> Result<WikidataToolOutput, ToolUseError> {
let result = self
.client
.sparql_query(&input.query)
.await
.map_err(|e| ToolUseError::InvocationFailed(e.to_string()))?;
Ok(WikidataToolOutput {
result: serde_json::to_string(&result).unwrap(),
})
}
}