import HttpClient from 'sosise-core/build/HttpClient/HttpClient'; import HttpClientRetryConfig from 'sosise-core/build/Types/HttpClientRetryConfig'; import ChatMessageType from '../../Types/LLM/ChatMessageType'; import CompletionResponseType from '../../Types/LLM/CompletionResponseType'; import LLMRepositoryInterface from './LLMRepositoryInterface'; /** * Groq Completion Repository * Handles communication with Groq API for chat completions */ export default class GroqCompletionRepository implements LLMRepositoryInterface { private static readonly BASE_URL = process.env.GROQ_BASE_URL || 'https://api.groq.com'; private static readonly API_KEY = process.env.GROQ_API_KEY || ''; private httpClient: HttpClient; private retryConfig: HttpClientRetryConfig = { requestMaxRetries: 3, requestRetryInterval: 2000, requestRetryStrategy: 'linear', requestDoNotRetryForHttpCodes: [400, 401, 403], }; /** * Constructor */ constructor() { // Instantiate http client this.httpClient = new HttpClient({ baseURL: GroqCompletionRepository.BASE_URL, headers: { Accept: 'application/json', 'Content-Type': 'application/json', Authorization: `Bearer ${GroqCompletionRepository.API_KEY}`, }, timeout: 600000, }); } /** * Get completion from Groq * @param messages - Array of chat messages * @param model - Model name to use * @param temperature - Optional temperature parameter * @returns Promise resolving to the completion response */ public async getCompletion(messages: ChatMessageType[], model: string, temperature?: number): Promise { // Prepare data const data: any = { model, messages, }; // Set temperature if provided if (temperature !== undefined) { data.temperature = temperature; } // Make request with retry const response = await this.httpClient.requestWithRetry({ url: '/openai/v1/chat/completions', method: 'POST', data }, this.retryConfig); // Return structured response // Note: Groq doesn't support prompt caching, so cachedInput is always 0 return { responseText: response.data.choices[0].message.content, usedTokens: { input: response.data.usage.prompt_tokens, cachedInput: 0, output: response.data.usage.completion_tokens, }, }; } }