use crate::client::ModelClient;
use crate::error::{OllamaError, Result};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSearchRequest {
pub query: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_results: Option<u8>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebFetchRequest {
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSearchResponse {
pub results: Vec<WebSearchResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSearchResult {
pub title: String,
pub url: String,
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebFetchResponse {
pub title: String,
pub content: String,
pub links: Vec<String>,
}
impl ModelClient {
pub async fn web_search(&self, request: WebSearchRequest) -> Result<WebSearchResponse> {
let url = self
.cloud_url
.join("api/web_search")
.map_err(OllamaError::UrlError)?;
let response = self
.client
.post(url)
.json(&request)
.send()
.await
.map_err(OllamaError::RequestError)?;
self.handle_response(response, None).await
}
pub async fn web_fetch(&self, request: WebFetchRequest) -> Result<WebFetchResponse> {
let url = self
.cloud_url
.join("api/web_fetch")
.map_err(OllamaError::UrlError)?;
let response = self
.client
.post(url)
.json(&request)
.send()
.await
.map_err(OllamaError::RequestError)?;
self.handle_response(response, None).await
}
}