diff --git a/src/backend/src/modules/puterai/lib/Messages.js b/src/backend/src/modules/puterai/lib/Messages.js new file mode 100644 index 00000000..5739c1ca --- /dev/null +++ b/src/backend/src/modules/puterai/lib/Messages.js @@ -0,0 +1,49 @@ +const { whatis } = require("../../../util/langutil"); + +module.exports = class Messages { + static normalize_single_message (message, params = {}) { + params = Object.assign({ + role: 'user', + }, params); + + if ( typeof message === 'string' ) { + message = { + content: [message], + }; + } + if ( whatis(message) !== 'object' ) { + throw new Error('each message must be a string or object'); + } + if ( ! message.role ) { + message.role = params.role; + } + if ( ! message.content ) { + throw new Error(`each message must have a 'content' property`); + } + if ( whatis(message.content) !== 'array' ) { + message.content = [message.content]; + } + for ( let i=0 ; i < message.content.length ; i++ ) { + if ( whatis(message.content[i]) === 'string' ) { + message.content[i] = { + type: 'text', + text: message.content[i], + }; + } + if ( whatis(message.content[i]) !== 'object' ) { + throw new Error('each message content item must be a string or object'); + } + if ( ! message.content[i].type ) { + message.content[i].type = 'text'; + } + } + + console.log('???', message) + return message; + } + static normalize_messages (messages, params = {}) { + for ( let i=0 ; i < messages.length ; i++ ) { + messages[i] = this.normalize_single_message(messages[i], params); + } + } +} \ No newline at end of file diff --git a/src/backend/src/modules/puterai/lib/messages.test.js b/src/backend/src/modules/puterai/lib/messages.test.js new file mode 100644 index 00000000..5f5603fe --- /dev/null +++ b/src/backend/src/modules/puterai/lib/messages.test.js @@ -0,0 +1,28 @@ +const { expect } = require('chai'); +const Messages = require('./Messages.js'); + +describe('Messages', () => { + describe('normalize_single_message', () => { + const cases = [ + { + name: 'string message', + input: 'Hello, world!', + output: { + role: 'user', + content: [ + { + type: 'text', + text: 'Hello, world!', + } + ] + } + } + ]; + for ( const tc of cases ) { + it(`should normalize ${tc.name}`, () => { + const output = Messages.normalize_single_message(tc.input); + expect(output).to.deep.equal(tc.output); + }); + } + }); +});