portkey_sdk/service/
completions.rs

1//! Completions API service.
2//!
3//! Provides access to the legacy completions endpoint.
4
5use std::future::Future;
6
7use crate::client::PortkeyClient;
8use crate::error::Result;
9use crate::model::{CompletionResponse, CreateCompletionRequest};
10
11/// Service trait for completions operations.
12pub trait CompletionsService {
13    /// Create a completion for the provided prompt and parameters.
14    ///
15    /// # Arguments
16    ///
17    /// * `request` - The completion request parameters
18    ///
19    /// # Example
20    ///
21    /// ```no_run
22    /// # use portkey_sdk::{PortkeyConfig, PortkeyClient, Result};
23    /// # use portkey_sdk::service::CompletionsService;
24    /// # use portkey_sdk::model::{CreateCompletionRequest, CompletionPrompt};
25    /// # async fn example() -> Result<()> {
26    /// let config = PortkeyConfig::from_env()?;
27    /// let client = PortkeyClient::new(config)?;
28    ///
29    /// let request = CreateCompletionRequest {
30    ///     model: "gpt-3.5-turbo-instruct".to_string(),
31    ///     prompt: Some(CompletionPrompt::String("Say this is a test".to_string())),
32    ///     max_tokens: Some(100),
33    ///     temperature: Some(0.7),
34    ///     ..Default::default()
35    /// };
36    ///
37    /// let response = client.create_completion(request).await?;
38    /// println!("Completion: {}", response.choices[0].text);
39    /// # Ok(())
40    /// # }
41    /// ```
42    fn create_completion(
43        &self,
44        request: CreateCompletionRequest,
45    ) -> impl Future<Output = Result<CompletionResponse>>;
46}
47
48impl CompletionsService for PortkeyClient {
49    #[cfg_attr(
50        feature = "tracing",
51        tracing::instrument(skip(self, request), fields(model = %request.model))
52    )]
53    async fn create_completion(
54        &self,
55        request: CreateCompletionRequest,
56    ) -> Result<CompletionResponse> {
57        #[cfg(feature = "tracing")]
58        tracing::debug!(
59            target: crate::TRACING_TARGET_SERVICE,
60            "Creating completion"
61        );
62
63        let response = self
64            .send_json(reqwest::Method::POST, "/completions", &request)
65            .await?
66            .error_for_status()?
67            .json::<CompletionResponse>()
68            .await?;
69
70        #[cfg(feature = "tracing")]
71        tracing::info!(
72            target: crate::TRACING_TARGET_SERVICE,
73            id = %response.id,
74            choices = response.choices.len(),
75            "Completion created successfully"
76        );
77
78        Ok(response)
79    }
80}
81
82// Add Default impl for CreateCompletionRequest
83impl Default for CreateCompletionRequest {
84    fn default() -> Self {
85        Self {
86            model: String::new(),
87            prompt: None,
88            max_tokens: Some(16),
89            temperature: Some(1.0),
90            top_p: Some(1.0),
91            n: Some(1),
92            stream: Some(false),
93            logprobs: None,
94            echo: Some(false),
95            stop: None,
96            frequency_penalty: Some(0.0),
97            presence_penalty: Some(0.0),
98            best_of: Some(1),
99            logit_bias: None,
100            user: None,
101            suffix: None,
102            seed: None,
103        }
104    }
105}