portkey_sdk/service/
feedback.rs

1use std::future::Future;
2
3#[cfg(feature = "tracing")]
4use crate::TRACING_TARGET_SERVICE;
5use crate::client::PortkeyClient;
6use crate::error::Result;
7use crate::model::{CreateFeedbackRequest, FeedbackResponse, UpdateFeedbackRequest};
8
9/// Service trait for managing feedback.
10///
11/// This trait provides methods for creating and updating feedback on traces,
12/// allowing you to track user satisfaction and model performance.
13///
14/// # Example
15///
16/// ```rust,no_run
17/// use portkey_sdk::{PortkeyConfig, Result};
18/// use portkey_sdk::service::FeedbackService;
19/// use portkey_sdk::builder::AuthMethod;
20/// use portkey_sdk::model::{CreateFeedbackRequest, UpdateFeedbackRequest};
21/// use std::collections::HashMap;
22///
23/// #[tokio::main]
24/// async fn main() -> Result<()> {
25///     let client = PortkeyConfig::builder()
26///         .with_api_key("your-portkey-api-key")
27///         .with_auth_method(AuthMethod::virtual_key("your-virtual-key"))
28///         .build_client()?;
29///
30///     // Create feedback
31///     let mut metadata = HashMap::new();
32///     metadata.insert("user_id".to_string(), serde_json::json!("user123"));
33///
34///     let create_request = CreateFeedbackRequest {
35///         trace_id: "trace-abc-123".to_string(),
36///         value: 5,
37///         weight: Some(1.0),
38///         metadata: Some(metadata),
39///     };
40///
41///     let response = client.create_feedback(create_request).await?;
42///     println!("Created feedback: {:?}", response.feedback_ids);
43///
44///     // Update feedback
45///     let feedback_id = &response.feedback_ids[0];
46///     let update_request = UpdateFeedbackRequest {
47///         value: 8,
48///         weight: Some(0.9),
49///         metadata: None,
50///     };
51///
52///     let update_response = client.update_feedback(feedback_id, update_request).await?;
53///     println!("Updated feedback: {}", update_response.message);
54///
55///     Ok(())
56/// }
57/// ```
58pub trait FeedbackService {
59    /// Creates feedback for a trace.
60    ///
61    /// # Arguments
62    ///
63    /// * `request` - The feedback data to create
64    ///
65    /// # Returns
66    ///
67    /// Returns a `FeedbackResponse` with the created feedback IDs.
68    ///
69    /// # Errors
70    ///
71    /// Returns an error if the API request fails or the response cannot be parsed.
72    fn create_feedback(
73        &self,
74        request: CreateFeedbackRequest,
75    ) -> impl Future<Output = Result<FeedbackResponse>>;
76
77    /// Updates existing feedback by ID.
78    ///
79    /// # Arguments
80    ///
81    /// * `feedback_id` - The unique identifier of the feedback to update
82    /// * `request` - The updated feedback data
83    ///
84    /// # Returns
85    ///
86    /// Returns a `FeedbackResponse` confirming the update.
87    ///
88    /// # Errors
89    ///
90    /// Returns an error if the feedback is not found or the API request fails.
91    fn update_feedback(
92        &self,
93        feedback_id: &str,
94        request: UpdateFeedbackRequest,
95    ) -> impl Future<Output = Result<FeedbackResponse>>;
96}
97
98impl FeedbackService for PortkeyClient {
99    async fn create_feedback(&self, request: CreateFeedbackRequest) -> Result<FeedbackResponse> {
100        #[cfg(feature = "tracing")]
101        tracing::debug!(
102            target: TRACING_TARGET_SERVICE,
103            trace_id = %request.trace_id,
104            value = request.value,
105            "Creating feedback"
106        );
107
108        let response = self
109            .send_json(reqwest::Method::POST, "/feedback", &request)
110            .await?;
111        let response = response.error_for_status()?;
112        let feedback_response: FeedbackResponse = response.json().await?;
113
114        Ok(feedback_response)
115    }
116
117    async fn update_feedback(
118        &self,
119        feedback_id: &str,
120        request: UpdateFeedbackRequest,
121    ) -> Result<FeedbackResponse> {
122        #[cfg(feature = "tracing")]
123        tracing::debug!(
124            target: TRACING_TARGET_SERVICE,
125            feedback_id = %feedback_id,
126            value = request.value,
127            "Updating feedback"
128        );
129
130        let path = format!("/feedback/{}", feedback_id);
131        let response = self
132            .send_json(reqwest::Method::PATCH, &path, &request)
133            .await?;
134        let response = response.error_for_status()?;
135        let feedback_response: FeedbackResponse = response.json().await?;
136
137        Ok(feedback_response)
138    }
139}