swiftide_integrations/open_router/
mod.rs1use config::OpenRouterConfig;
7use derive_builder::Builder;
8use std::sync::Arc;
9
10pub mod chat_completion;
11pub mod config;
12pub mod simple_prompt;
13
14#[derive(Debug, Builder, Clone)]
25#[builder(setter(into, strip_option))]
26pub struct OpenRouter {
27 #[builder(default = "default_client()", setter(custom))]
29 client: Arc<async_openai::Client<OpenRouterConfig>>,
30 #[builder(default)]
32 default_options: Options,
33}
34
35impl Default for OpenRouter {
36 fn default() -> Self {
37 Self {
38 client: default_client(),
39 default_options: Options::default(),
40 }
41 }
42}
43
44#[derive(Debug, Default, Clone, Builder)]
47#[builder(setter(into, strip_option))]
48pub struct Options {
49 #[builder(default)]
51 pub prompt_model: Option<String>,
52}
53
54impl Options {
55 pub fn builder() -> OptionsBuilder {
57 OptionsBuilder::default()
58 }
59}
60
61impl OpenRouter {
62 pub fn builder() -> OpenRouterBuilder {
64 OpenRouterBuilder::default()
65 }
66
67 pub fn with_default_prompt_model(&mut self, model: impl Into<String>) -> &mut Self {
69 self.default_options = Options {
70 prompt_model: Some(model.into()),
71 };
72 self
73 }
74}
75
76impl OpenRouterBuilder {
77 pub fn client(&mut self, client: async_openai::Client<OpenRouterConfig>) -> &mut Self {
85 self.client = Some(Arc::new(client));
86 self
87 }
88
89 pub fn default_prompt_model(&mut self, model: impl Into<String>) -> &mut Self {
97 if let Some(options) = self.default_options.as_mut() {
98 options.prompt_model = Some(model.into());
99 } else {
100 self.default_options = Some(Options {
101 prompt_model: Some(model.into()),
102 });
103 }
104 self
105 }
106}
107
108fn default_client() -> Arc<async_openai::Client<OpenRouterConfig>> {
109 Arc::new(async_openai::Client::with_config(
110 OpenRouterConfig::default(),
111 ))
112}
113
114#[cfg(test)]
115mod test {
116 use super::*;
117
118 #[test]
119 fn test_default_prompt_model() {
120 let openai = OpenRouter::builder()
121 .default_prompt_model("llama3.1")
122 .build()
123 .unwrap();
124 assert_eq!(
125 openai.default_options.prompt_model,
126 Some("llama3.1".to_string())
127 );
128 }
129
130 #[test]
131 fn test_default_models() {
132 let openrouter = OpenRouter::builder()
133 .default_prompt_model("llama3.1")
134 .build()
135 .unwrap();
136 assert_eq!(
137 openrouter.default_options.prompt_model,
138 Some("llama3.1".to_string())
139 );
140 }
141
142 #[test]
143 fn test_building_via_default_prompt_model() {
144 let mut client = OpenRouter::default();
145
146 assert!(client.default_options.prompt_model.is_none());
147
148 client.with_default_prompt_model("llama3.1");
149 assert_eq!(
150 client.default_options.prompt_model,
151 Some("llama3.1".to_string())
152 );
153 }
154}