@@ -189,6 +189,51 @@ class OpenAIImageProvider implements ImageProvider {
189
189
}
190
190
}
191
191
192
+
193
+ class GroqImageProvider implements ImageProvider {
194
+ constructor ( private runtime : IAgentRuntime ) { }
195
+
196
+ async initialize ( ) : Promise < void > { }
197
+
198
+ async describeImage (
199
+ imageData : Buffer ,
200
+ mimeType : string
201
+ ) : Promise < { title : string ; description : string } > {
202
+ const imageUrl = convertToBase64DataUrl ( imageData , mimeType ) ;
203
+
204
+ const content = [
205
+ { type : "text" , text : IMAGE_DESCRIPTION_PROMPT } ,
206
+ { type : "image_url" , image_url : { url : imageUrl } } ,
207
+ ] ;
208
+
209
+ const endpoint =
210
+ this . runtime . imageVisionModelProvider === ModelProviderName . GROQ
211
+ ? getEndpoint ( this . runtime . imageVisionModelProvider )
212
+ : "https://api.groq.com/openai/v1/" ;
213
+
214
+ const response = await fetch ( endpoint + "/chat/completions" , {
215
+ method : "POST" ,
216
+ headers : {
217
+ "Content-Type" : "application/json" ,
218
+ Authorization : `Bearer ${ this . runtime . getSetting ( "GROQ_API_KEY" ) } ` ,
219
+ } ,
220
+ body : JSON . stringify ( {
221
+ model : /*this.runtime.imageVisionModelName ||*/ "llama-3.2-90b-vision-preview" ,
222
+ messages : [ { role : "user" , content } ] ,
223
+ max_tokens : 1024 ,
224
+ } ) ,
225
+ } ) ;
226
+
227
+ if ( ! response . ok ) {
228
+ await handleApiError ( response , "Groq" ) ;
229
+ }
230
+
231
+ const data = await response . json ( ) ;
232
+ return parseImageResponse ( data . choices [ 0 ] . message . content ) ;
233
+ }
234
+ }
235
+
236
+
192
237
class GoogleImageProvider implements ImageProvider {
193
238
constructor ( private runtime : IAgentRuntime ) { }
194
239
@@ -280,6 +325,12 @@ export class ImageDescriptionService
280
325
) {
281
326
this . provider = new OpenAIImageProvider ( this . runtime ) ;
282
327
elizaLogger . debug ( "Using openai for vision model" ) ;
328
+ } else if (
329
+ this . runtime . imageVisionModelProvider ===
330
+ ModelProviderName . GROQ
331
+ ) {
332
+ this . provider = new GroqImageProvider ( this . runtime ) ;
333
+ elizaLogger . debug ( "Using Groq for vision model" ) ;
283
334
} else {
284
335
elizaLogger . error (
285
336
`Unsupported image vision model provider: ${ this . runtime . imageVisionModelProvider } `
@@ -291,6 +342,9 @@ export class ImageDescriptionService
291
342
} else if ( model === models [ ModelProviderName . GOOGLE ] ) {
292
343
this . provider = new GoogleImageProvider ( this . runtime ) ;
293
344
elizaLogger . debug ( "Using google for vision model" ) ;
345
+ } else if ( model === models [ ModelProviderName . GROQ ] ) {
346
+ this . provider = new GroqImageProvider ( this . runtime ) ;
347
+ elizaLogger . debug ( "Using groq for vision model" ) ;
294
348
} else {
295
349
elizaLogger . debug ( "Using default openai for vision model" ) ;
296
350
this . provider = new OpenAIImageProvider ( this . runtime ) ;
0 commit comments