1use crate::client::ModelClient;
16use crate::error::{OllamaError, Result};
17use serde::{Deserialize, Serialize};
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct WebSearchRequest {
22 pub query: String,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub max_results: Option<u8>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct WebFetchRequest {
30 pub url: String,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct WebSearchResponse {
36 pub results: Vec<WebSearchResult>,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct WebSearchResult {
42 pub title: String,
43 pub url: String,
44 pub content: String,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct WebFetchResponse {
50 pub title: String,
51 pub content: String,
52 pub links: Vec<String>,
53}
54
55impl ModelClient {
56 pub async fn web_search(&self, request: WebSearchRequest) -> Result<WebSearchResponse> {
60 let url = self
61 .cloud_url
62 .join("api/web_search")
63 .map_err(OllamaError::UrlError)?;
64 let response = self
65 .client
66 .post(url)
67 .json(&request)
68 .send()
69 .await
70 .map_err(OllamaError::RequestError)?;
71
72 self.handle_response(response, None).await
73 }
74
75 pub async fn web_fetch(&self, request: WebFetchRequest) -> Result<WebFetchResponse> {
79 let url = self
80 .cloud_url
81 .join("api/web_fetch")
82 .map_err(OllamaError::UrlError)?;
83 let response = self
84 .client
85 .post(url)
86 .json(&request)
87 .send()
88 .await
89 .map_err(OllamaError::RequestError)?;
90
91 self.handle_response(response, None).await
92 }
93}