1use async_trait::async_trait;
2use serde::{Deserialize, Serialize};
3
4use crate::v0::Meta;
5use crate::{client::KagiClient, KagiError, KagiResult};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct Answer {
9 pub meta: Meta,
10 pub data: Data,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct Data {
15 pub output: String,
16 pub tokens: usize,
17 pub references: Option<Vec<Reference>>,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct Reference {
22 pub title: String,
23 pub snippet: String,
24 pub url: String,
25}
26
27#[async_trait]
28pub trait FastGPT {
29 async fn fastgpt(&self, query: &str, cache: bool) -> KagiResult<Answer>;
30}
31
32#[async_trait]
33impl FastGPT for KagiClient {
34 async fn fastgpt(&self, query: &str, cache: bool) -> KagiResult<Answer> {
35 let request_body = serde_json::json!({ "query": query, "cache": cache });
36 let response = self.query("/v0/fastgpt", request_body).await?;
37 response
38 .json::<Answer>()
39 .await
40 .map_err(KagiError::ReqwestError)
41 }
42}