openrouter_rs/types/
mod.rs

1//! # Core Types and Data Structures
2//!
3//! This module contains all the core types, enums, and data structures used
4//! throughout the OpenRouter SDK. These types provide type-safe representations
5//! of API requests, responses, and configuration options.
6//!
7//! ## 📋 Type Categories
8//!
9//! ### Request/Response Types ([`completion`])
10//! - **Chat Completions**: Modern conversational AI request/response structures
11//! - **Text Completions**: Legacy prompt-based completion types
12//! - **Streaming**: Types for handling real-time response streams
13//! - **Reasoning**: Advanced reasoning and chain-of-thought structures
14//!
15//! ### Provider Information ([`provider`])
16//! - **Model Metadata**: Provider-specific model information
17//! - **Capabilities**: Model feature and parameter support
18//! - **Pricing**: Cost information and token usage
19//!
20//! ### Response Formatting ([`response_format`])
21//! - **JSON Schema**: Structured output formatting
22//! - **Content Types**: Different response content formats
23//! - **Validation**: Response format validation rules
24//!
25//! ## 🎯 Core Enums
26//!
27//! ### Role
28//! Defines the role of a message in a conversation:
29//!
30//! ```rust
31//! use openrouter_rs::types::Role;
32//!
33//! let system_role = Role::System;    // System instructions
34//! let user_role = Role::User;        // User input
35//! let assistant_role = Role::Assistant; // AI response
36//! let tool_role = Role::Tool;        // Tool/function results
37//! let developer_role = Role::Developer; // Developer context
38//! ```
39//!
40//! ### Effort
41//! Specifies reasoning effort levels for chain-of-thought models:
42//!
43//! ```rust
44//! use openrouter_rs::types::Effort;
45//!
46//! let high_effort = Effort::High;    // Maximum reasoning depth
47//! let medium_effort = Effort::Medium; // Balanced reasoning
48//! let low_effort = Effort::Low;      // Quick reasoning
49//! ```
50//!
51//! ## 🔧 Configuration Types
52//!
53//! ### ReasoningConfig
54//! Configuration for advanced reasoning capabilities:
55//!
56//! ```rust
57//! use openrouter_rs::types::{ReasoningConfig, Effort};
58//!
59//! let reasoning = ReasoningConfig::builder()
60//!     .enabled(true)
61//!     .effort(Effort::High)
62//!     .max_tokens(1000)
63//!     .build()?;
64//! # Ok::<(), Box<dyn std::error::Error>>(())
65//! ```
66//!
67//! ### ProviderPreferences
68//! Specify preferences for model provider selection:
69//!
70//! ```rust
71//! use openrouter_rs::types::ProviderPreferences;
72//!
73//! let prefs = ProviderPreferences {
74//!     allow_fallbacks: true,
75//!     require_parameters: Some(vec!["tools".to_string()]),
76//!     data_collection: Some("deny".to_string()),
77//! };
78//! ```
79//!
80//! ## 📊 Model Categories
81//!
82//! Categories for filtering and organizing models:
83//!
84//! ```rust
85//! use openrouter_rs::types::ModelCategory;
86//!
87//! // Filter models by use case
88//! let programming_models = ModelCategory::Programming;
89//! let reasoning_models = ModelCategory::Reasoning;
90//! let image_models = ModelCategory::Image;
91//! ```
92//!
93//! ## 🏗️ Builder Patterns
94//!
95//! Most complex types support the builder pattern for ergonomic construction:
96//!
97//! ```rust
98//! use openrouter_rs::types::{ReasoningConfig, Effort};
99//!
100//! let config = ReasoningConfig::builder()
101//!     .enabled(true)
102//!     .effort(Effort::High)
103//!     .max_tokens(2000)
104//!     .exclude(false)
105//!     .build()?;
106//! # Ok::<(), Box<dyn std::error::Error>>(())
107//! ```
108//!
109//! ## 🔄 Serialization Support
110//!
111//! All types implement `Serialize` and `Deserialize` for JSON compatibility:
112//!
113//! ```rust
114//! use openrouter_rs::types::Role;
115//! use serde_json;
116//!
117//! let role = Role::Assistant;
118//! let json = serde_json::to_string(&role)?;
119//! let parsed: Role = serde_json::from_str(&json)?;
120//! # Ok::<(), Box<dyn std::error::Error>>(())
121//! ```
122//!
123//! ## 🎨 Display Formatting
124//!
125//! Common enums implement `Display` for human-readable output:
126//!
127//! ```rust
128//! use openrouter_rs::types::{Role, Effort};
129//!
130//! println!("Role: {}", Role::User);        // "user"
131//! println!("Effort: {}", Effort::High);    // "high"
132//! ```
133
134pub mod completion;
135pub mod provider;
136pub mod response_format;
137
138use std::fmt::Display;
139
140use serde::{Deserialize, Serialize};
141
142pub use {completion::*, provider::*, response_format::*};
143
144#[derive(Serialize, Deserialize, Debug)]
145pub struct ApiResponse<T> {
146    pub data: T,
147}
148
149/// Message role in a conversation
150///
151/// Specifies who or what is sending a message in a chat completion.
152/// Different roles have different behaviors and restrictions.
153///
154/// # Examples
155///
156/// ```rust
157/// use openrouter_rs::types::Role;
158/// use openrouter_rs::api::chat::Message;
159///
160/// let system_msg = Message::new(Role::System, "You are a helpful assistant");
161/// let user_msg = Message::new(Role::User, "Hello, world!");
162/// let assistant_msg = Message::new(Role::Assistant, "Hello! How can I help?");
163/// ```
164#[derive(Serialize, Deserialize, Debug, Clone)]
165#[serde(rename_all = "lowercase")]
166pub enum Role {
167    /// System instructions that guide the AI's behavior
168    System,
169    /// Developer/admin context (provider-specific)
170    Developer,
171    /// User input or questions
172    User,
173    /// AI assistant responses
174    Assistant,
175    /// Results from tool/function calls
176    Tool,
177}
178
179impl Display for Role {
180    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
181        match self {
182            Role::System => write!(f, "system"),
183            Role::Developer => write!(f, "developer"),
184            Role::User => write!(f, "user"),
185            Role::Assistant => write!(f, "assistant"),
186            Role::Tool => write!(f, "tool"),
187        }
188    }
189}
190
191/// Reasoning effort level for chain-of-thought models
192///
193/// Controls how much computational effort the model should put into
194/// reasoning through problems. Higher effort levels typically produce
195/// more detailed reasoning but take longer and cost more.
196///
197/// # Examples
198///
199/// ```rust
200/// use openrouter_rs::types::Effort;
201/// use openrouter_rs::api::chat::ChatCompletionRequest;
202///
203/// let request = ChatCompletionRequest::builder()
204///     .model("deepseek/deepseek-r1")
205///     .reasoning_effort(Effort::High)  // Maximum reasoning depth
206///     // ... other fields
207///     .build()?;
208/// # Ok::<(), Box<dyn std::error::Error>>(())
209/// ```
210#[derive(Serialize, Deserialize, Debug, Clone)]
211#[serde(rename_all = "lowercase")]
212pub enum Effort {
213    /// Maximum reasoning depth and thoroughness
214    High,
215    /// Balanced reasoning effort
216    Medium,
217    /// Quick, lightweight reasoning
218    Low,
219}
220
221impl Display for Effort {
222    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
223        match self {
224            Effort::High => write!(f, "high"),
225            Effort::Medium => write!(f, "medium"),
226            Effort::Low => write!(f, "low"),
227        }
228    }
229}
230
231#[derive(Serialize, Deserialize, Debug, Clone)]
232pub struct ReasoningConfig {
233    #[serde(skip_serializing_if = "Option::is_none")]
234    pub effort: Option<Effort>,
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub max_tokens: Option<u32>,
237    #[serde(skip_serializing_if = "Option::is_none")]
238    pub exclude: Option<bool>,
239    #[serde(skip_serializing_if = "Option::is_none")]
240    pub enabled: Option<bool>,
241}
242
243impl ReasoningConfig {
244    /// Create a new ReasoningConfig with default enabled settings (medium effort)
245    pub fn enabled() -> Self {
246        Self {
247            effort: None,
248            max_tokens: None,
249            exclude: None,
250            enabled: Some(true),
251        }
252    }
253
254    /// Create a ReasoningConfig with specific effort level
255    pub fn with_effort(effort: Effort) -> Self {
256        Self {
257            effort: Some(effort),
258            max_tokens: None,
259            exclude: None,
260            enabled: None,
261        }
262    }
263
264    /// Create a ReasoningConfig with max tokens limit
265    pub fn with_max_tokens(max_tokens: u32) -> Self {
266        Self {
267            effort: None,
268            max_tokens: Some(max_tokens),
269            exclude: None,
270            enabled: None,
271        }
272    }
273
274    /// Create a ReasoningConfig that excludes reasoning from response
275    pub fn excluded() -> Self {
276        Self {
277            effort: None,
278            max_tokens: None,
279            exclude: Some(true),
280            enabled: None,
281        }
282    }
283
284    /// Set effort level
285    pub fn effort(mut self, effort: Effort) -> Self {
286        self.effort = Some(effort);
287        self
288    }
289
290    /// Set max tokens
291    pub fn max_tokens(mut self, max_tokens: u32) -> Self {
292        self.max_tokens = Some(max_tokens);
293        self
294    }
295
296    /// Set exclude flag
297    pub fn exclude(mut self, exclude: bool) -> Self {
298        self.exclude = Some(exclude);
299        self
300    }
301}
302
303#[derive(Serialize, Deserialize, Debug, Clone)]
304#[serde(rename_all = "lowercase")]
305pub enum ModelCategory {
306    Roleplay,
307    Programming,
308    Marketing,
309    #[serde(rename = "marketing/seo")]
310    MarketingSeo,
311    Technology,
312    Science,
313    Translation,
314    Legal,
315    Finance,
316    Health,
317    Trivia,
318    Academia,
319}
320
321impl Display for ModelCategory {
322    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
323        match self {
324            ModelCategory::Roleplay => write!(f, "roleplay"),
325            ModelCategory::Programming => write!(f, "programming"),
326            ModelCategory::Marketing => write!(f, "marketing"),
327            ModelCategory::MarketingSeo => write!(f, "marketing/seo"),
328            ModelCategory::Technology => write!(f, "technology"),
329            ModelCategory::Science => write!(f, "science"),
330            ModelCategory::Translation => write!(f, "translation"),
331            ModelCategory::Legal => write!(f, "legal"),
332            ModelCategory::Finance => write!(f, "finance"),
333            ModelCategory::Health => write!(f, "health"),
334            ModelCategory::Trivia => write!(f, "trivia"),
335            ModelCategory::Academia => write!(f, "academia"),
336        }
337    }
338}
339
340impl ModelCategory {
341    pub fn all() -> Vec<ModelCategory> {
342        vec![
343            ModelCategory::Roleplay,
344            ModelCategory::Programming,
345            ModelCategory::Marketing,
346            ModelCategory::MarketingSeo,
347            ModelCategory::Technology,
348            ModelCategory::Science,
349            ModelCategory::Translation,
350            ModelCategory::Legal,
351            ModelCategory::Finance,
352            ModelCategory::Health,
353            ModelCategory::Trivia,
354            ModelCategory::Academia,
355        ]
356    }
357}
358
359#[derive(Serialize, Deserialize, Debug, Clone)]
360#[serde(rename_all = "snake_case")]
361pub enum SupportedParameters {
362    Tools,
363    Temperature,
364    TopP,
365    TopK,
366    MinP,
367    TopA,
368    FrequencyPenalty,
369    PresencePenalty,
370    RepetitionPenalty,
371    MaxTokens,
372    LogitBias,
373    Logprobs,
374    TopLogprobs,
375    Seed,
376    ResponseFormat,
377    StructuredOutputs,
378    Stop,
379    IncludeReasoning,
380    Reasoning,
381    WebSearchOptions,
382}
383
384impl Display for SupportedParameters {
385    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
386        match self {
387            SupportedParameters::Tools => write!(f, "tools"),
388            SupportedParameters::Temperature => write!(f, "temperature"),
389            SupportedParameters::TopP => write!(f, "top_p"),
390            SupportedParameters::TopK => write!(f, "top_k"),
391            SupportedParameters::MinP => write!(f, "min_p"),
392            SupportedParameters::TopA => write!(f, "top_a"),
393            SupportedParameters::FrequencyPenalty => write!(f, "frequency_penalty"),
394            SupportedParameters::PresencePenalty => write!(f, "presence_penalty"),
395            SupportedParameters::RepetitionPenalty => write!(f, "repetition_penalty"),
396            SupportedParameters::MaxTokens => write!(f, "max_tokens"),
397            SupportedParameters::LogitBias => write!(f, "logit_bias"),
398            SupportedParameters::Logprobs => write!(f, "logprobs"),
399            SupportedParameters::TopLogprobs => write!(f, "top_logprobs"),
400            SupportedParameters::Seed => write!(f, "seed"),
401            SupportedParameters::ResponseFormat => write!(f, "response_format"),
402            SupportedParameters::StructuredOutputs => write!(f, "structured_outputs"),
403            SupportedParameters::Stop => write!(f, "stop"),
404            SupportedParameters::IncludeReasoning => write!(f, "include_reasoning"),
405            SupportedParameters::Reasoning => write!(f, "reasoning"),
406            SupportedParameters::WebSearchOptions => write!(f, "web_search_options"),
407        }
408    }
409}
410
411impl SupportedParameters {
412    pub fn all() -> Vec<SupportedParameters> {
413        vec![
414            SupportedParameters::Tools,
415            SupportedParameters::Temperature,
416            SupportedParameters::TopP,
417            SupportedParameters::TopK,
418            SupportedParameters::MinP,
419            SupportedParameters::TopA,
420            SupportedParameters::FrequencyPenalty,
421            SupportedParameters::PresencePenalty,
422            SupportedParameters::RepetitionPenalty,
423            SupportedParameters::MaxTokens,
424            SupportedParameters::LogitBias,
425            SupportedParameters::Logprobs,
426            SupportedParameters::TopLogprobs,
427            SupportedParameters::Seed,
428            SupportedParameters::ResponseFormat,
429            SupportedParameters::StructuredOutputs,
430            SupportedParameters::Stop,
431            SupportedParameters::IncludeReasoning,
432            SupportedParameters::Reasoning,
433            SupportedParameters::WebSearchOptions,
434        ]
435    }
436}