llm_kit_groq/lib.rs
1//! Groq provider implementation for the LLM Kit.
2//!
3//! This crate provides a provider implementation for Groq's chat models,
4//! supporting ultra-fast inference with open-source models.
5//!
6//! # Features
7//!
8//! - Chat completions with Llama, Gemma, and other open-source models
9//! - Ultra-fast inference speeds
10//! - Streaming support
11//! - Tool calling
12//! - Whisper transcription support
13//! - Groq-specific metadata (cached tokens)
14//! - Image URL support
15//!
16//! # Examples
17//!
18//! ## Basic Usage with Client Builder (Recommended)
19//!
20//! ```no_run
21//! use llm_kit_groq::GroqClient;
22//!
23//! // Create a provider using the client builder
24//! let provider = GroqClient::new()
25//! .api_key("your-api-key")
26//! .build();
27//!
28//! let model = provider.chat_model("llama-3.1-8b-instant");
29//! ```
30//!
31//! ## Alternative: Direct Instantiation
32//!
33//! ```no_run
34//! use llm_kit_groq::{GroqProvider, GroqProviderSettings};
35//!
36//! // Create a provider using settings
37//! let provider = GroqProvider::new(
38//! GroqProviderSettings::new()
39//! .with_api_key("your-api-key")
40//! );
41//!
42//! let model = provider.chat_model("llama-3.3-70b-versatile");
43//! ```
44//!
45//! ## Chained Usage
46//!
47//! ```no_run
48//! use llm_kit_groq::GroqClient;
49//!
50//! let model = GroqClient::new()
51//! .api_key("your-api-key")
52//! .build()
53//! .chat_model("llama-3.1-8b-instant");
54//! ```
55//!
56//! ## Environment Variable
57//!
58//! ```no_run
59//! use llm_kit_groq::GroqClient;
60//!
61//! // API key will be read from GROQ_API_KEY environment variable
62//! let provider = GroqClient::new()
63//! .load_api_key_from_env()
64//! .build();
65//!
66//! let model = provider.chat_model("llama-3.1-8b-instant");
67//! ```
68//!
69//! ## Text Generation
70//!
71//! ```no_run
72//! use llm_kit_groq::GroqClient;
73//! use llm_kit_provider::LanguageModel;
74//! use llm_kit_provider::language_model::call_options::LanguageModelCallOptions;
75//! use llm_kit_provider::language_model::prompt::LanguageModelMessage;
76//!
77//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
78//! let provider = GroqClient::new()
79//! .api_key("your-api-key")
80//! .build();
81//!
82//! let model = provider.chat_model("llama-3.1-8b-instant");
83//!
84//! let prompt = vec![LanguageModelMessage::user_text(
85//! "Explain quantum computing in simple terms"
86//! )];
87//!
88//! let options = LanguageModelCallOptions::new(prompt)
89//! .with_temperature(0.7)
90//! .with_max_output_tokens(500);
91//!
92//! let result = model.do_generate(options).await?;
93//!
94//! // Extract text from content
95//! let text = result.content.iter()
96//! .filter_map(|c| match c {
97//! llm_kit_provider::language_model::content::LanguageModelContent::Text(t) => Some(t.text.clone()),
98//! _ => None,
99//! })
100//! .collect::<Vec<_>>()
101//! .join("");
102//!
103//! println!("Response: {}", text);
104//! # Ok(())
105//! # }
106//! ```
107//!
108//! ## Streaming
109//!
110//! ```no_run
111//! use llm_kit_groq::GroqClient;
112//! use llm_kit_provider::LanguageModel;
113//! use llm_kit_provider::language_model::call_options::LanguageModelCallOptions;
114//! use llm_kit_provider::language_model::prompt::LanguageModelMessage;
115//! use llm_kit_provider::language_model::stream_part::LanguageModelStreamPart;
116//! use futures_util::StreamExt;
117//!
118//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
119//! let provider = GroqClient::new()
120//! .api_key("your-api-key")
121//! .build();
122//!
123//! let model = provider.chat_model("llama-3.1-8b-instant");
124//!
125//! let prompt = vec![LanguageModelMessage::user_text("Tell me a story")];
126//! let options = LanguageModelCallOptions::new(prompt);
127//!
128//! let result = model.do_stream(options).await?;
129//! let mut stream = result.stream;
130//!
131//! // Stream text deltas
132//! while let Some(part) = stream.next().await {
133//! if let LanguageModelStreamPart::TextDelta(delta) = part {
134//! print!("{}", delta.delta);
135//! }
136//! }
137//! # Ok(())
138//! # }
139//! ```
140//!
141//! ## Tool Calling
142//!
143//! Groq supports tool/function calling. See the `examples/chat_tool_calling.rs`
144//! and `examples/stream_tool_calling.rs` examples for complete working implementations.
145//!
146//! ## Groq-Specific Metadata
147//!
148//! Groq provides cached token statistics in the metadata:
149//!
150//! ```no_run
151//! use llm_kit_groq::GroqClient;
152//! use llm_kit_provider::LanguageModel;
153//! use llm_kit_provider::language_model::call_options::LanguageModelCallOptions;
154//! use llm_kit_provider::language_model::prompt::LanguageModelMessage;
155//!
156//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
157//! let provider = GroqClient::new()
158//! .api_key("your-api-key")
159//! .build();
160//!
161//! let model = provider.chat_model("llama-3.1-8b-instant");
162//!
163//! let prompt = vec![LanguageModelMessage::user_text("Hello")];
164//! let options = LanguageModelCallOptions::new(prompt);
165//!
166//! let result = model.do_generate(options).await?;
167//!
168//! // Access Groq-specific metadata
169//! if let Some(provider_metadata) = &result.provider_metadata {
170//! if let Some(groq) = provider_metadata.get("groq") {
171//! println!("Cached tokens: {:?}", groq.get("cachedTokens"));
172//! }
173//! }
174//! # Ok(())
175//! # }
176//! ```
177//!
178//! ## Transcription (Whisper)
179//!
180//! Groq provides ultra-fast Whisper transcription:
181//!
182//! ```no_run
183//! use llm_kit_groq::{GroqClient, GroqTranscriptionOptions};
184//! use llm_kit_provider::transcription_model::call_options::TranscriptionModelCallOptions;
185//! use llm_kit_provider::TranscriptionModel;
186//!
187//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
188//! let provider = GroqClient::new()
189//! .api_key("your-api-key")
190//! .build();
191//!
192//! let model = provider.transcription_model("whisper-large-v3");
193//!
194//! // Read audio file
195//! let audio_data = std::fs::read("audio.mp3")?;
196//!
197//! // Configure options
198//! let mut provider_options = std::collections::HashMap::new();
199//! let mut groq_opts_map = std::collections::HashMap::new();
200//! let groq_options = GroqTranscriptionOptions::new()
201//! .with_language("en")
202//! .with_verbose_json();
203//!
204//! // Convert to nested structure
205//! let groq_value = serde_json::to_value(&groq_options)?;
206//! if let serde_json::Value::Object(map) = groq_value {
207//! for (k, v) in map {
208//! groq_opts_map.insert(k, v);
209//! }
210//! }
211//! provider_options.insert("groq".to_string(), groq_opts_map);
212//!
213//! let options = TranscriptionModelCallOptions::mp3(audio_data)
214//! .with_provider_options(provider_options);
215//!
216//! let result = model.do_generate(options).await?;
217//! println!("Transcription: {}", result.text);
218//! # Ok(())
219//! # }
220//! ```
221
222/// Chat completion implementation for Groq models.
223pub mod chat;
224
225/// Client builder for creating Groq providers.
226pub mod client;
227
228/// Error types for Groq provider operations.
229pub mod error;
230
231/// Provider implementation and creation functions.
232pub mod provider;
233
234/// Settings and configuration for Groq providers.
235pub mod settings;
236
237/// Speech synthesis implementation for Groq text-to-speech models.
238pub mod speech;
239
240/// Transcription implementation for Groq Whisper models.
241pub mod transcription;
242
243// Re-export main types from chat
244pub use chat::{
245 GroqChatConfig, GroqChatLanguageModel, GroqChatModelId, GroqMetadataExtractor,
246 GroqProviderOptions, GroqUsage, ReasoningFormat, ServiceTier,
247};
248
249pub use client::GroqClient;
250pub use error::{GroqError, GroqErrorData};
251pub use provider::GroqProvider;
252pub use settings::GroqProviderSettings;
253
254// Re-export speech types
255pub use speech::{GroqSpeechConfig, GroqSpeechModel, GroqSpeechOptions};
256
257// Re-export transcription types
258pub use transcription::{
259 GroqTranscriptionConfig, GroqTranscriptionModel, GroqTranscriptionModelId,
260 GroqTranscriptionOptions,
261};