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}