Skip to content

Commit 2808057

Browse files
fix(groq): Support generic messages in messageToGroqRole (langchain-ai#8917)
1 parent 4a230e2 commit 2808057

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@langchain/groq": patch
3+
---
4+
5+
fix(groq): Support generic messages in messageToGroqRole

libs/langchain-groq/src/chat_models.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,8 +292,32 @@ interface TokenUsage {
292292
totalTokens?: number;
293293
}
294294

295+
/**
296+
* Extract the custom role from a message.
297+
* @param message - The message to extract the custom role from.
298+
* @returns The custom role of the message.
299+
*/
300+
function extractGenericMessageCustomRole(message: ChatMessage): GroqRoleEnum {
301+
if (
302+
message.role !== "system" &&
303+
message.role !== "assistant" &&
304+
message.role !== "user" &&
305+
message.role !== "function"
306+
) {
307+
throw new Error(
308+
`Unsupported message role: ${message.role}. Expected "system", "assistant", "user", or "function"`
309+
);
310+
}
311+
return message.role as GroqRoleEnum;
312+
}
313+
314+
/**
315+
* Extract the role from a message.
316+
* @param message - The message to extract the role from.
317+
* @returns The role of the message.
318+
*/
295319
export function messageToGroqRole(message: BaseMessage): GroqRoleEnum {
296-
const type = message._getType();
320+
const type = message.getType();
297321
switch (type) {
298322
case "system":
299323
return "system";
@@ -306,6 +330,11 @@ export function messageToGroqRole(message: BaseMessage): GroqRoleEnum {
306330
case "tool":
307331
// Not yet supported as a type
308332
return "tool" as GroqRoleEnum;
333+
case "generic": {
334+
if (!ChatMessage.isInstance(message))
335+
throw new Error("Invalid generic chat message");
336+
return extractGenericMessageCustomRole(message);
337+
}
309338
default:
310339
throw new Error(`Unknown message type: ${type}`);
311340
}

libs/langchain-groq/src/tests/chat_models.test.ts

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
/* eslint-disable no-process-env */
22
import { test, expect } from "@jest/globals";
3-
import { ChatGroq } from "../chat_models.js";
3+
import { ChatMessage } from "@langchain/core/messages";
4+
5+
import { ChatGroq, messageToGroqRole } from "../chat_models.js";
46

57
test("Serialization", () => {
68
const model = new ChatGroq({
@@ -11,3 +13,37 @@ test("Serialization", () => {
1113
`{"lc":1,"type":"constructor","id":["langchain","chat_models","groq","ChatGroq"],"kwargs":{"api_key":{"lc":1,"type":"secret","id":["GROQ_API_KEY"]},"model":"llama-3.3-70b-versatile"}}`
1214
);
1315
});
16+
17+
test("messageToGroqRole", () => {
18+
// Test generic messages (ChatMessage type = "generic") with valid roles
19+
// These test the extractGenericMessageCustomRole path
20+
const genericUser = new ChatMessage("Hello, world!", "user");
21+
expect(messageToGroqRole(genericUser)).toBe("user");
22+
23+
const genericAssistant = new ChatMessage("Hello, world!", "assistant");
24+
expect(messageToGroqRole(genericAssistant)).toBe("assistant");
25+
26+
const genericSystem = new ChatMessage("Hello, world!", "system");
27+
expect(messageToGroqRole(genericSystem)).toBe("system");
28+
29+
const genericFunction = new ChatMessage("Hello, world!", "function");
30+
expect(messageToGroqRole(genericFunction)).toBe("function");
31+
32+
// Test generic message with tool role - should throw via extractGenericMessageCustomRole
33+
const genericTool = new ChatMessage("Hello, world!", "tool");
34+
expect(() => messageToGroqRole(genericTool)).toThrow(
35+
'Unsupported message role: tool. Expected "system", "assistant", "user", or "function"'
36+
);
37+
38+
// Test generic message with invalid role - should throw via extractGenericMessageCustomRole
39+
const genericInvalid = new ChatMessage("Invalid message", "invalid");
40+
expect(() => messageToGroqRole(genericInvalid)).toThrow(
41+
'Unsupported message role: invalid. Expected "system", "assistant", "user", or "function"'
42+
);
43+
44+
// Test generic message with custom role that's not supported
45+
const genericCustom = new ChatMessage("Custom message", "custom-role");
46+
expect(() => messageToGroqRole(genericCustom)).toThrow(
47+
'Unsupported message role: custom-role. Expected "system", "assistant", "user", or "function"'
48+
);
49+
});

0 commit comments

Comments
 (0)