@nomyx/assistant
Version:
A powerful assistant library and cli for your AI projects. works with Vertex AI (Claude and Gemini)
69 lines (62 loc) • 2.23 kB
text/typescript
import { AIProviderMiddleware } from '../types/provider';
import { ChatMessage } from '../types/chat';
export class MessageCollationMiddleware implements AIProviderMiddleware {
async preProcess(messages: ChatMessage[]): Promise<ChatMessage[]> {
const collatedMessages: ChatMessage[] = [];
let currentRole: string | null = null;
let currentContent: string[] = [];
for (const message of messages) {
if (message.role !== currentRole) {
if (currentRole !== null) {
collatedMessages.push({
role: currentRole,
content: currentContent.join('\n')
});
}
currentRole = message.role;
currentContent = [message.content];
} else {
currentContent.push(message.content);
}
}
if (currentRole !== null) {
collatedMessages.push({
role: currentRole,
content: currentContent.join('\n')
});
}
// Ensure roles alternate between "user" and "assistant"
const alternatingMessages: ChatMessage[] = [];
let lastRole: string | null = null;
for (const message of collatedMessages) {
if (message.role === 'system') {
// Prepend system messages to the user's first message
if (alternatingMessages.length === 0) {
alternatingMessages.push({
role: 'system',
content: `${message.content}\n\n`
});
} else {
alternatingMessages[0].content = `${message.content}\n\n${alternatingMessages[0].content}`;
}
} else if (message.role !== lastRole) {
alternatingMessages.push(message);
lastRole = message.role;
} else {
// If the role is the same as the last one, insert a dummy message from the other role
const dummyRole = message.role === 'user' ? 'assistant' : 'user';
alternatingMessages.push({
role: dummyRole,
content: 'Continuing the conversation...'
});
alternatingMessages.push(message);
lastRole = message.role;
}
}
return alternatingMessages;
}
async postProcess(response: any): Promise<any> {
// No post-processing needed for this middleware
return response;
}
}