use serde::{Deserialize, Serialize};
use crate::error::RemoteFailure;
pub use crate::generation::{Artifact, Citation};
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(tag = "type", rename_all = "snake_case", deny_unknown_fields)]
pub enum HostedTool {
WebSearch,
UrlContext,
FileSearch {
store_ids: Vec<String>,
},
CodeExecution,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "state", rename_all = "snake_case")]
pub enum HostedToolStatus {
InProgress,
Completed,
Incomplete,
Failed {
error: RemoteFailure,
},
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum HostedWebSearchAction {
Search {
query: Option<String>,
queries: Vec<String>,
sources: Vec<HostedWebSearchSource>,
},
OpenPage {
url: Option<String>,
},
FindInPage {
url: String,
pattern: String,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct HostedWebSearchSource {
pub title: Option<String>,
pub url: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct HostedWebSearchResult {
pub title: Option<String>,
pub url: String,
pub snippet: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct HostedExecutableCode {
pub language: Option<String>,
pub code: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct HostedCodeExecutionResult {
pub status: Option<HostedToolStatus>,
pub logs: Option<String>,
pub stdout: Option<String>,
pub stderr: Option<String>,
pub exit_code: Option<i64>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct HostedFileSearchResult {
pub file_id: String,
pub file_name: Option<String>,
pub text: Option<String>,
pub score: Option<f64>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "family", rename_all = "snake_case")]
pub enum HostedToolOutput {
WebSearch {
status: Option<HostedToolStatus>,
action: Option<HostedWebSearchAction>,
results: Vec<HostedWebSearchResult>,
citations: Vec<Citation>,
},
FileSearch {
status: Option<HostedToolStatus>,
queries: Vec<String>,
results: Option<Vec<HostedFileSearchResult>>,
citations: Vec<Citation>,
},
CodeExecution {
status: Option<HostedToolStatus>,
code: Vec<HostedExecutableCode>,
results: Vec<HostedCodeExecutionResult>,
artifacts: Vec<Artifact>,
},
UrlContext {
requested_url: Option<String>,
retrieved_url: Option<String>,
status: Option<HostedToolStatus>,
citations: Vec<Citation>,
},
}