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};