OpenRouterClient

Struct OpenRouterClient 

Source
pub struct OpenRouterClient { /* private fields */ }
Expand description

OpenRouter API client for issue triage.

Holds HTTP client, API key, and model configuration for reuse across multiple requests. Enables connection pooling and cleaner API.

Implementations§

Source§

impl OpenRouterClient

Source

pub fn new(config: &AiConfig) -> Result<Self>

Creates a new OpenRouter client from configuration.

Validates the model against cost control settings and fetches the API key from the environment.

§Arguments
  • config - AI configuration with model, timeout, and cost control settings
§Errors

Returns an error if:

  • Model is not in free tier and allow_paid_models is false
  • OPENROUTER_API_KEY environment variable is not set
  • HTTP client creation fails
Source

pub fn with_api_key(api_key: SecretString, config: &AiConfig) -> Result<Self>

Creates a new OpenRouter client with a provided API key.

This constructor allows callers to provide an API key directly, enabling multi-platform credential resolution (e.g., from iOS keychain via FFI).

§Arguments
  • api_key - OpenRouter API key as a SecretString
  • config - AI configuration with model, timeout, and cost control settings
§Errors

Returns an error if:

  • Model is not in free tier and allow_paid_models is false
  • HTTP client creation fails
Source

pub async fn analyze_issue(&self, issue: &IssueDetails) -> Result<AiResponse>

Analyzes a GitHub issue using the OpenRouter API.

Returns a structured triage response with summary, labels, questions, duplicates, and usage stats.

§Arguments
  • issue - Issue details to analyze
§Errors

Returns an error if:

  • API request fails (network, timeout, rate limit)
  • Response cannot be parsed as valid JSON
Source

pub async fn create_issue( &self, title: &str, body: &str, repo: &str, ) -> Result<CreateIssueResponse>

Creates a formatted GitHub issue using the OpenRouter API.

Takes raw issue title and body, formats them using AI (conventional commit style, structured body), and returns the formatted content with suggested labels.

§Arguments
  • title - Raw issue title from user
  • body - Raw issue body/description from user
  • repo - Repository name for context (owner/repo format)
§Errors

Returns an error if:

  • API request fails (network, timeout, rate limit)
  • Response cannot be parsed as valid JSON

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<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
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