Skip to content

Commit 15b5d25

Browse files
authored
Merge pull request #2342 from rferrari/feature/groq-image-vision-provider
feat: groq image vision provider
2 parents f5bbeea + ec6b2f5 commit 15b5d25

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

packages/core/src/runtime.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -349,9 +349,9 @@ export class AgentRuntime implements IAgentRuntime {
349349
this.imageVisionModelProvider =
350350
this.character.imageVisionModelProvider ?? this.modelProvider;
351351

352-
elizaLogger.info("Selected model provider:", this.modelProvider);
352+
// elizaLogger.info("Selected model provider:", this.modelProvider); duplicated log ln: 343
353353
elizaLogger.info(
354-
"Selected image model provider:",
354+
"Selected image vision model provider:",
355355
this.imageVisionModelProvider
356356
);
357357

packages/plugin-node/src/services/image.ts

+54
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,51 @@ class OpenAIImageProvider implements ImageProvider {
189189
}
190190
}
191191

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+
192237
class GoogleImageProvider implements ImageProvider {
193238
constructor(private runtime: IAgentRuntime) {}
194239

@@ -280,6 +325,12 @@ export class ImageDescriptionService
280325
) {
281326
this.provider = new OpenAIImageProvider(this.runtime);
282327
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");
283334
} else {
284335
elizaLogger.error(
285336
`Unsupported image vision model provider: ${this.runtime.imageVisionModelProvider}`
@@ -291,6 +342,9 @@ export class ImageDescriptionService
291342
} else if (model === models[ModelProviderName.GOOGLE]) {
292343
this.provider = new GoogleImageProvider(this.runtime);
293344
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");
294348
} else {
295349
elizaLogger.debug("Using default openai for vision model");
296350
this.provider = new OpenAIImageProvider(this.runtime);

0 commit comments

Comments
 (0)