|
const AnthropicClient = require('../AnthropicClient'); |
|
const HUMAN_PROMPT = '\n\nHuman:'; |
|
const AI_PROMPT = '\n\nAssistant:'; |
|
|
|
describe('AnthropicClient', () => { |
|
let client; |
|
const model = 'claude-2'; |
|
const parentMessageId = '1'; |
|
const messages = [ |
|
{ role: 'user', isCreatedByUser: true, text: 'Hello', messageId: parentMessageId }, |
|
{ role: 'assistant', isCreatedByUser: false, text: 'Hi', messageId: '2', parentMessageId }, |
|
{ |
|
role: 'user', |
|
isCreatedByUser: true, |
|
text: 'What\'s up', |
|
messageId: '3', |
|
parentMessageId: '2', |
|
}, |
|
]; |
|
|
|
beforeEach(() => { |
|
const options = { |
|
modelOptions: { |
|
model, |
|
temperature: 0.7, |
|
}, |
|
}; |
|
client = new AnthropicClient('test-api-key'); |
|
client.setOptions(options); |
|
}); |
|
|
|
describe('setOptions', () => { |
|
it('should set the options correctly', () => { |
|
expect(client.apiKey).toBe('test-api-key'); |
|
expect(client.modelOptions.model).toBe(model); |
|
expect(client.modelOptions.temperature).toBe(0.7); |
|
}); |
|
}); |
|
|
|
describe('getSaveOptions', () => { |
|
it('should return the correct save options', () => { |
|
const options = client.getSaveOptions(); |
|
expect(options).toHaveProperty('modelLabel'); |
|
expect(options).toHaveProperty('promptPrefix'); |
|
}); |
|
}); |
|
|
|
describe('buildMessages', () => { |
|
it('should handle promptPrefix from options when promptPrefix argument is not provided', async () => { |
|
client.options.promptPrefix = 'Test Prefix from options'; |
|
const result = await client.buildMessages(messages, parentMessageId); |
|
const { prompt } = result; |
|
expect(prompt).toContain('Test Prefix from options'); |
|
}); |
|
|
|
it('should build messages correctly for chat completion', async () => { |
|
const result = await client.buildMessages(messages, '2'); |
|
expect(result).toHaveProperty('prompt'); |
|
expect(result.prompt).toContain(HUMAN_PROMPT); |
|
expect(result.prompt).toContain('Hello'); |
|
expect(result.prompt).toContain(AI_PROMPT); |
|
expect(result.prompt).toContain('Hi'); |
|
}); |
|
|
|
it('should group messages by the same author', async () => { |
|
const groupedMessages = messages.map((m) => ({ ...m, isCreatedByUser: true, role: 'user' })); |
|
const result = await client.buildMessages(groupedMessages, '3'); |
|
expect(result.context).toHaveLength(1); |
|
|
|
|
|
const matches = result.prompt.match(new RegExp(HUMAN_PROMPT, 'g')); |
|
expect(matches).toHaveLength(1); |
|
|
|
groupedMessages.push({ |
|
role: 'assistant', |
|
isCreatedByUser: false, |
|
text: 'I heard you the first time', |
|
messageId: '4', |
|
parentMessageId: '3', |
|
}); |
|
|
|
const result2 = await client.buildMessages(groupedMessages, '4'); |
|
expect(result2.context).toHaveLength(2); |
|
|
|
|
|
const human_matches = result2.prompt.match(new RegExp(HUMAN_PROMPT, 'g')); |
|
const ai_matches = result2.prompt.match(new RegExp(AI_PROMPT, 'g')); |
|
expect(human_matches).toHaveLength(1); |
|
expect(ai_matches).toHaveLength(1); |
|
}); |
|
|
|
it('should handle isEdited condition', async () => { |
|
const editedMessages = [ |
|
{ role: 'user', isCreatedByUser: true, text: 'Hello', messageId: '1' }, |
|
{ role: 'assistant', isCreatedByUser: false, text: 'Hi', messageId: '2', parentMessageId }, |
|
]; |
|
|
|
const trimmedLabel = AI_PROMPT.trim(); |
|
const result = await client.buildMessages(editedMessages, '2'); |
|
expect(result.prompt.trim().endsWith(trimmedLabel)).toBeFalsy(); |
|
|
|
|
|
editedMessages.push({ |
|
role: 'user', |
|
isCreatedByUser: true, |
|
text: 'Hi again', |
|
messageId: '3', |
|
parentMessageId: '2', |
|
}); |
|
const result2 = await client.buildMessages(editedMessages, '3'); |
|
expect(result2.prompt.trim().endsWith(trimmedLabel)).toBeTruthy(); |
|
}); |
|
|
|
it('should build messages correctly with a promptPrefix', async () => { |
|
const promptPrefix = 'Test Prefix'; |
|
client.options.promptPrefix = promptPrefix; |
|
const result = await client.buildMessages(messages, parentMessageId); |
|
const { prompt } = result; |
|
expect(prompt).toBeDefined(); |
|
expect(prompt).toContain(promptPrefix); |
|
const textAfterPrefix = prompt.split(promptPrefix)[1]; |
|
expect(textAfterPrefix).toContain(AI_PROMPT); |
|
|
|
const editedMessages = messages.slice(0, -1); |
|
const result2 = await client.buildMessages(editedMessages, parentMessageId); |
|
const textAfterPrefix2 = result2.prompt.split(promptPrefix)[1]; |
|
expect(textAfterPrefix2).toContain(AI_PROMPT); |
|
}); |
|
|
|
it('should handle identityPrefix from options', async () => { |
|
client.options.userLabel = 'John'; |
|
client.options.modelLabel = 'Claude-2'; |
|
const result = await client.buildMessages(messages, parentMessageId); |
|
const { prompt } = result; |
|
expect(prompt).toContain('Human\'s name: John'); |
|
expect(prompt).toContain('You are Claude-2'); |
|
}); |
|
}); |
|
}); |
|
|