rig_core/providers/perplexity/
extension.rs1use serde::{Deserialize, Serialize};
20use serde_json::Value;
21
22use crate::completion::provider_options::reply_field;
23use crate::completion::{ExtensionOptions, ProviderExtension, ReplyExtras};
24use crate::message::Api;
25
26#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
28pub struct PerplexityExt;
29
30impl ProviderExtension for PerplexityExt {
31 const PROVIDER: &'static str = super::PROVIDER_NAME;
32 type Options = PerplexityOptions;
33 type Extras = PerplexityExtras;
34}
35
36#[non_exhaustive]
38#[derive(Clone, Debug, Default, PartialEq, Serialize)]
39pub struct PerplexityOptions {}
40
41impl PerplexityOptions {
42 pub fn new() -> Self {
44 Self::default()
45 }
46}
47
48impl ExtensionOptions for PerplexityOptions {
49 type Ext = PerplexityExt;
50}
51
52#[non_exhaustive]
54#[derive(Clone, Debug, Default, PartialEq)]
55pub struct PerplexityExtras {
56 pub citations: Option<Vec<String>>,
58 pub search_results: Option<Vec<SearchResult>>,
60 pub images: Option<Vec<Value>>,
62 pub related_questions: Option<Vec<String>>,
64 pub cost: Option<PerplexityCost>,
66 pub search_context_size: Option<String>,
68}
69
70#[non_exhaustive]
72#[derive(Clone, Debug, Default, PartialEq, Eq, Deserialize)]
73pub struct SearchResult {
74 #[serde(default)]
76 pub title: Option<String>,
77 #[serde(default)]
79 pub url: Option<String>,
80 #[serde(default)]
82 pub date: Option<String>,
83 #[serde(default)]
85 pub last_updated: Option<String>,
86 #[serde(default)]
88 pub snippet: Option<String>,
89 #[serde(default)]
91 pub source: Option<String>,
92}
93
94#[non_exhaustive]
96#[derive(Clone, Copy, Debug, Default, PartialEq, Deserialize)]
97pub struct PerplexityCost {
98 #[serde(default)]
100 pub input_tokens_cost: Option<f64>,
101 #[serde(default)]
103 pub output_tokens_cost: Option<f64>,
104 #[serde(default)]
106 pub request_cost: Option<f64>,
107 #[serde(default)]
109 pub total_cost: Option<f64>,
110}
111
112impl ReplyExtras for PerplexityExtras {
113 fn from_reply(_api: &Api, raw: &Value) -> Result<Self, serde_json::Error> {
114 Ok(Self {
115 citations: reply_field(raw, "/citations")?,
116 search_results: reply_field(raw, "/search_results")?,
117 images: reply_field(raw, "/images")?,
118 related_questions: reply_field(raw, "/related_questions")?,
119 cost: reply_field(raw, "/usage/cost")?,
120 search_context_size: reply_field(raw, "/usage/search_context_size")?,
121 })
122 }
123}
124
125#[cfg(test)]
126mod tests;