Skip to main content

synaptic_openai/
compat.rs

1//! Convenience constructors for OpenAI-compatible providers.
2//!
3//! Each provider uses the same wire format as OpenAI but with a different
4//! base URL. The functions in this module pre-configure `OpenAiConfig` and
5//! `OpenAiEmbeddingsConfig` with the correct endpoint.
6
7use std::sync::Arc;
8
9use synaptic_models::ProviderBackend;
10
11use crate::{OpenAiChatModel, OpenAiConfig, OpenAiEmbeddings, OpenAiEmbeddingsConfig};
12
13// ---------------------------------------------------------------------------
14// Groq
15// ---------------------------------------------------------------------------
16
17/// Create an OpenAI-compatible config for Groq.
18pub fn groq_config(api_key: impl Into<String>, model: impl Into<String>) -> OpenAiConfig {
19    OpenAiConfig::new(api_key, model).with_base_url("https://api.groq.com/openai/v1")
20}
21
22/// Create a Groq chat model.
23pub fn groq_chat_model(
24    api_key: impl Into<String>,
25    model: impl Into<String>,
26    backend: Arc<dyn ProviderBackend>,
27) -> OpenAiChatModel {
28    OpenAiChatModel::new(groq_config(api_key, model), backend)
29}
30
31// ---------------------------------------------------------------------------
32// DeepSeek
33// ---------------------------------------------------------------------------
34
35/// Create an OpenAI-compatible config for DeepSeek.
36pub fn deepseek_config(api_key: impl Into<String>, model: impl Into<String>) -> OpenAiConfig {
37    OpenAiConfig::new(api_key, model).with_base_url("https://api.deepseek.com/v1")
38}
39
40/// Create a DeepSeek chat model.
41pub fn deepseek_chat_model(
42    api_key: impl Into<String>,
43    model: impl Into<String>,
44    backend: Arc<dyn ProviderBackend>,
45) -> OpenAiChatModel {
46    OpenAiChatModel::new(deepseek_config(api_key, model), backend)
47}
48
49// ---------------------------------------------------------------------------
50// Fireworks
51// ---------------------------------------------------------------------------
52
53/// Create an OpenAI-compatible config for Fireworks AI.
54pub fn fireworks_config(api_key: impl Into<String>, model: impl Into<String>) -> OpenAiConfig {
55    OpenAiConfig::new(api_key, model).with_base_url("https://api.fireworks.ai/inference/v1")
56}
57
58/// Create a Fireworks AI chat model.
59pub fn fireworks_chat_model(
60    api_key: impl Into<String>,
61    model: impl Into<String>,
62    backend: Arc<dyn ProviderBackend>,
63) -> OpenAiChatModel {
64    OpenAiChatModel::new(fireworks_config(api_key, model), backend)
65}
66
67// ---------------------------------------------------------------------------
68// Together
69// ---------------------------------------------------------------------------
70
71/// Create an OpenAI-compatible config for Together AI.
72pub fn together_config(api_key: impl Into<String>, model: impl Into<String>) -> OpenAiConfig {
73    OpenAiConfig::new(api_key, model).with_base_url("https://api.together.xyz/v1")
74}
75
76/// Create a Together AI chat model.
77pub fn together_chat_model(
78    api_key: impl Into<String>,
79    model: impl Into<String>,
80    backend: Arc<dyn ProviderBackend>,
81) -> OpenAiChatModel {
82    OpenAiChatModel::new(together_config(api_key, model), backend)
83}
84
85// ---------------------------------------------------------------------------
86// xAI
87// ---------------------------------------------------------------------------
88
89/// Create an OpenAI-compatible config for xAI.
90pub fn xai_config(api_key: impl Into<String>, model: impl Into<String>) -> OpenAiConfig {
91    OpenAiConfig::new(api_key, model).with_base_url("https://api.x.ai/v1")
92}
93
94/// Create an xAI chat model.
95pub fn xai_chat_model(
96    api_key: impl Into<String>,
97    model: impl Into<String>,
98    backend: Arc<dyn ProviderBackend>,
99) -> OpenAiChatModel {
100    OpenAiChatModel::new(xai_config(api_key, model), backend)
101}
102
103// ---------------------------------------------------------------------------
104// MistralAI  (+Embeddings)
105// ---------------------------------------------------------------------------
106
107/// Create an OpenAI-compatible config for Mistral AI.
108pub fn mistral_config(api_key: impl Into<String>, model: impl Into<String>) -> OpenAiConfig {
109    OpenAiConfig::new(api_key, model).with_base_url("https://api.mistral.ai/v1")
110}
111
112/// Create a Mistral AI chat model.
113pub fn mistral_chat_model(
114    api_key: impl Into<String>,
115    model: impl Into<String>,
116    backend: Arc<dyn ProviderBackend>,
117) -> OpenAiChatModel {
118    OpenAiChatModel::new(mistral_config(api_key, model), backend)
119}
120
121/// Create an OpenAI-compatible embeddings config for Mistral AI.
122pub fn mistral_embeddings_config(api_key: impl Into<String>) -> OpenAiEmbeddingsConfig {
123    OpenAiEmbeddingsConfig::new(api_key).with_base_url("https://api.mistral.ai/v1")
124}
125
126/// Create Mistral AI embeddings.
127pub fn mistral_embeddings(
128    api_key: impl Into<String>,
129    backend: Arc<dyn ProviderBackend>,
130) -> OpenAiEmbeddings {
131    OpenAiEmbeddings::new(mistral_embeddings_config(api_key), backend)
132}
133
134// ---------------------------------------------------------------------------
135// HuggingFace  (+Embeddings)
136// ---------------------------------------------------------------------------
137
138/// Create an OpenAI-compatible config for HuggingFace Inference API.
139pub fn huggingface_config(api_key: impl Into<String>, model: impl Into<String>) -> OpenAiConfig {
140    OpenAiConfig::new(api_key, model).with_base_url("https://router.huggingface.co/v1")
141}
142
143/// Create a HuggingFace chat model.
144pub fn huggingface_chat_model(
145    api_key: impl Into<String>,
146    model: impl Into<String>,
147    backend: Arc<dyn ProviderBackend>,
148) -> OpenAiChatModel {
149    OpenAiChatModel::new(huggingface_config(api_key, model), backend)
150}
151
152/// Create an OpenAI-compatible embeddings config for HuggingFace.
153pub fn huggingface_embeddings_config(api_key: impl Into<String>) -> OpenAiEmbeddingsConfig {
154    OpenAiEmbeddingsConfig::new(api_key).with_base_url("https://router.huggingface.co/v1")
155}
156
157/// Create HuggingFace embeddings.
158pub fn huggingface_embeddings(
159    api_key: impl Into<String>,
160    backend: Arc<dyn ProviderBackend>,
161) -> OpenAiEmbeddings {
162    OpenAiEmbeddings::new(huggingface_embeddings_config(api_key), backend)
163}
164
165// ---------------------------------------------------------------------------
166// Cohere  (+Embeddings)
167// ---------------------------------------------------------------------------
168
169/// Create an OpenAI-compatible config for Cohere.
170pub fn cohere_config(api_key: impl Into<String>, model: impl Into<String>) -> OpenAiConfig {
171    OpenAiConfig::new(api_key, model).with_base_url("https://api.cohere.ai/compatibility/v1")
172}
173
174/// Create a Cohere chat model.
175pub fn cohere_chat_model(
176    api_key: impl Into<String>,
177    model: impl Into<String>,
178    backend: Arc<dyn ProviderBackend>,
179) -> OpenAiChatModel {
180    OpenAiChatModel::new(cohere_config(api_key, model), backend)
181}
182
183/// Create an OpenAI-compatible embeddings config for Cohere.
184pub fn cohere_embeddings_config(api_key: impl Into<String>) -> OpenAiEmbeddingsConfig {
185    OpenAiEmbeddingsConfig::new(api_key).with_base_url("https://api.cohere.ai/compatibility/v1")
186}
187
188/// Create Cohere embeddings.
189pub fn cohere_embeddings(
190    api_key: impl Into<String>,
191    backend: Arc<dyn ProviderBackend>,
192) -> OpenAiEmbeddings {
193    OpenAiEmbeddings::new(cohere_embeddings_config(api_key), backend)
194}
195
196// ---------------------------------------------------------------------------
197// OpenRouter
198// ---------------------------------------------------------------------------
199
200/// Create an OpenAI-compatible config for OpenRouter.
201pub fn openrouter_config(api_key: impl Into<String>, model: impl Into<String>) -> OpenAiConfig {
202    OpenAiConfig::new(api_key, model).with_base_url("https://openrouter.ai/api/v1")
203}
204
205/// Create an OpenRouter chat model.
206pub fn openrouter_chat_model(
207    api_key: impl Into<String>,
208    model: impl Into<String>,
209    backend: Arc<dyn ProviderBackend>,
210) -> OpenAiChatModel {
211    OpenAiChatModel::new(openrouter_config(api_key, model), backend)
212}