kagi-api 0.1.1

Kagi.com API bindings (Search, FastGPT, Universal Summarizer, Enrichment)
Documentation
use async_trait::async_trait;
use serde::{Deserialize, Serialize};

use crate::v0::Meta;
use crate::{client::KagiClient, KagiError, KagiResult};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Answer {
    pub meta: Meta,
    pub data: Data,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Data {
    pub output: String,
    pub tokens: usize,
    pub references: Option<Vec<Reference>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reference {
    pub title: String,
    pub snippet: String,
    pub url: String,
}

#[async_trait]
pub trait FastGPT {
    async fn fastgpt(&self, query: &str, cache: bool) -> KagiResult<Answer>;
}

#[async_trait]
impl FastGPT for KagiClient {
    async fn fastgpt(&self, query: &str, cache: bool) -> KagiResult<Answer> {
        let request_body = serde_json::json!({ "query": query, "cache": cache });
        let response = self.query("/v0/fastgpt", request_body).await?;
        response
            .json::<Answer>()
            .await
            .map_err(KagiError::ReqwestError)
    }
}