use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use ts_rs::TS;
use crate::error::AiMuxError;
use crate::shared::{AbortSignal, SharedHeaders, SharedProviderMetadata, SharedProviderOptions};
use crate::types::Warning;
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct SearchCallOptions {
pub query: String,
pub max_results: Option<u32>,
pub include_raw_content: Option<bool>,
pub time_range: Option<String>,
pub include_domains: Option<Vec<String>>,
pub exclude_domains: Option<Vec<String>>,
#[serde(skip)]
#[ts(skip)]
pub abort_signal: Option<AbortSignal>,
pub provider_options: Option<SharedProviderOptions>,
pub headers: Option<SharedHeaders>,
}
impl SearchCallOptions {
pub fn new(query: impl Into<String>) -> Self {
Self {
query: query.into(),
max_results: None,
include_raw_content: None,
time_range: None,
include_domains: None,
exclude_domains: None,
abort_signal: None,
provider_options: None,
headers: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct SearchResultItem {
pub title: Option<String>,
pub url: Option<String>,
pub content: Option<String>,
pub raw_content: Option<String>,
pub score: Option<f64>,
pub provider_metadata: Option<SharedProviderMetadata>,
}
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct SearchResult {
pub results: Vec<SearchResultItem>,
pub answer: Option<String>,
pub provider_metadata: Option<SharedProviderMetadata>,
pub warnings: Vec<Warning>,
pub response: Option<SearchResponse>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct SearchResponse {
pub headers: Option<SharedHeaders>,
pub body: Option<serde_json::Value>,
}
#[async_trait]
pub trait SearchModel: Send + Sync {
fn specification_version(&self) -> &'static str {
"v4"
}
fn provider(&self) -> &str;
fn model_id(&self) -> &str;
async fn do_search(&self, options: &SearchCallOptions) -> Result<SearchResult, AiMuxError>;
}