use crate::entity::{
AiOptimizationLlmResponse, AiOptimizationLlmResponseModel, AiOptimizationTaskReady,
};
use crate::{DataForSeoApiResponse, DataForSeoClient};
use serde::{Deserialize, Serialize};
pub struct AiOptimizationApiLlmResponses<'a> {
pub(crate) client: &'a DataForSeoClient,
pub(crate) provider: &'static str,
}
impl AiOptimizationApiLlmResponses<'_> {
pub async fn models(&self) -> DataForSeoApiResponse<AiOptimizationLlmResponseModel> {
self.client
.http_get(&format!(
"/v3/ai_optimization/{}/llm_responses/models",
self.provider
))
.await
}
pub async fn live(
&self,
data: Vec<AiOptimizationLlmResponsesPost>,
) -> DataForSeoApiResponse<AiOptimizationLlmResponse> {
self.client
.http_post(
&format!("/v3/ai_optimization/{}/llm_responses/live", self.provider),
&data,
)
.await
}
pub async fn task_post(
&self,
data: Vec<AiOptimizationLlmResponsesPost>,
) -> DataForSeoApiResponse<AiOptimizationLlmResponse> {
self.client
.http_post(
&format!(
"/v3/ai_optimization/{}/llm_responses/task_post",
self.provider
),
&data,
)
.await
}
pub async fn tasks_ready(&self) -> DataForSeoApiResponse<AiOptimizationTaskReady> {
self.client
.http_get(&format!(
"/v3/ai_optimization/{}/llm_responses/tasks_ready",
self.provider
))
.await
}
pub async fn task_get(&self, id: &str) -> DataForSeoApiResponse<AiOptimizationLlmResponse> {
self.client
.http_get(&format!(
"/v3/ai_optimization/{}/llm_responses/task_get/{}",
self.provider, id
))
.await
}
}
pub struct AiOptimizationApiPerplexityLlmResponses<'a> {
pub(crate) client: &'a DataForSeoClient,
}
impl AiOptimizationApiPerplexityLlmResponses<'_> {
pub async fn models(&self) -> DataForSeoApiResponse<AiOptimizationLlmResponseModel> {
self.client
.http_get("/v3/ai_optimization/perplexity/llm_responses/models")
.await
}
pub async fn live(
&self,
data: Vec<AiOptimizationLlmResponsesPost>,
) -> DataForSeoApiResponse<AiOptimizationLlmResponse> {
self.client
.http_post("/v3/ai_optimization/perplexity/llm_responses/live", &data)
.await
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct AiOptimizationLlmMessage {
pub role: String,
pub message: String,
}
impl AiOptimizationLlmMessage {
pub fn new(role: &str, message: &str) -> AiOptimizationLlmMessage {
AiOptimizationLlmMessage {
role: role.to_string(),
message: message.to_string(),
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct AiOptimizationLlmResponsesPost {
pub user_prompt: String,
pub model_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_output_tokens: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub web_search: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub force_web_search: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub web_search_country_iso_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub web_search_city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub system_message: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_chain: Option<Vec<AiOptimizationLlmMessage>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub postback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pingback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl AiOptimizationLlmResponsesPost {
pub fn new(user_prompt: &str, model_name: &str) -> AiOptimizationLlmResponsesPost {
AiOptimizationLlmResponsesPost {
user_prompt: user_prompt.to_string(),
model_name: model_name.to_string(),
..Default::default()
}
}
}