Struct AIClientFactory

Source
pub struct AIClientFactory;
Expand description

AI client factory for creating provider instances.

The AIClientFactory provides a centralized way to create AI provider instances based on configuration. It supports multiple AI service providers and handles the complexity of client initialization and configuration.

§Design Pattern

This factory follows the Abstract Factory pattern, providing a single interface for creating different types of AI clients while hiding the specific implementation details from the consumer.

§Provider Selection

The factory automatically selects the appropriate provider implementation based on the provider field in the configuration:

  • "openai" - Creates an OpenAI client instance
  • "anthropic" - Creates an Anthropic client (future support)
  • "google" - Creates a Google AI client (future support)
  • "local" - Creates a local model client (future support)

§Error Handling

The factory returns detailed errors for:

  • Unsupported provider names
  • Invalid configuration parameters
  • Missing required credentials
  • Network connectivity issues during client creation

§Examples

use subx_cli::services::ai::AIClientFactory;
use subx_cli::config::AIConfig;

// Create a configured OpenAI client
let config = AIConfig {
    provider: "openai".to_string(),
    api_key: Some("sk-your-api-key".to_string()),
    model: "gpt-4.1".to_string(),
    base_url: "https://api.openai.com/v1".to_string(),
    max_sample_length: 2000,
    temperature: 0.3,
    retry_attempts: 3,
    retry_delay_ms: 1000,
};

let client = AIClientFactory::create_client(&config)?;
// Client is ready for content analysis

Implementations§

Source§

impl AIClientFactory

Source

pub fn create_client(config: &AIConfig) -> Result<Box<dyn AIProvider>>

Creates an AI provider instance based on the provided configuration.

This method examines the provider field in the configuration and instantiates the appropriate AI client implementation. The returned client is fully configured and ready for use.

§Arguments
  • config - AI configuration containing provider details and credentials
§Returns

Returns a boxed trait object implementing AIProvider that can be used for content analysis and subtitle matching operations.

§Errors

This method returns an error if:

  • The specified provider is not supported
  • Required configuration fields are missing or invalid
  • API credentials are invalid or missing
  • Network connectivity issues prevent client initialization
§Examples
use subx_cli::services::ai::AIClientFactory;
use subx_cli::config::AIConfig;

let config = AIConfig {
    provider: "openai".to_string(),
    api_key: Some("sk-key".to_string()),
    model: "gpt-4.1".to_string(),
    // ... other configuration
};

match AIClientFactory::create_client(&config) {
    Ok(client) => {
        // Use client for analysis
        let result = client.analyze_content(request).await?;
    }
    Err(e) => {
        eprintln!("Failed to create AI client: {}", e);
    }
}
§Supported Providers

Current supported providers:

  • "openai" - OpenAI GPT models with chat completion API

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,