intellinode
Version:
Create AI agents using the latest models, including ChatGPT, Llama, Diffusion, Cohere, Gemini, and Hugging Face.
581 lines (501 loc) • 14.4 kB
JavaScript
/*
Apache License
Copyright 2023 Github.com/Barqawiz/IntelliNode
Licensed under the Apache License, Version 2.0 (the "License");
*/
const config = require('../../config.json');
class ChatGPTMessage {
constructor(content, role, name = null) {
this.content = content;
this.role = role;
this.name = name;
}
isSystemRole() {
return this.role === 'system';
}
}
class ChatModelInput {
constructor(options = {}) {
this.searchK = options.searchK || 3;
this.attachReference = options.attachReference || false;
}
getChatInput() {
return null;
}
}
class ChatGPTInput extends ChatModelInput {
constructor(systemMessage, options = {}) {
super(options);
if (
systemMessage instanceof ChatGPTMessage &&
systemMessage.isSystemRole()
) {
this.messages = [systemMessage];
} else if (typeof systemMessage === 'string') {
this.messages = [new ChatGPTMessage(systemMessage, 'system')];
} else {
throw new Error(
'The input type should be system to define the chatbot theme or instructions.'
);
}
this.model = options.model || 'gpt-5';
this.temperature = options.temperature || 1;
this.maxTokens = options.maxTokens || null;
this.numberOfOutputs = 1;
this.effort = options.effort || 'low'; // GPT-5 reasoning effort: minimal, low, medium, high
}
addMessage(message) {
this.messages.push(message);
}
addUserMessage(prompt) {
this.messages.push(new ChatGPTMessage(prompt, 'user'));
}
addAssistantMessage(prompt) {
this.messages.push(new ChatGPTMessage(prompt, 'assistant'));
}
addSystemMessage(prompt) {
this.messages.push(new ChatGPTMessage(prompt, 'system'));
}
cleanMessages() {
if (this.messages.length > 1) {
const firstMessage = this.messages[0];
this.messages = [firstMessage];
}
}
deleteLastMessage(message) {
for (let i = this.messages.length - 1; i >= 0; i--) {
const currentMessage = this.messages[i];
if (
currentMessage.content === message.content &&
currentMessage.role === message.role
) {
this.messages.splice(i, 1);
return true;
}
}
return false;
}
getChatInput() {
const messages = this.messages.map((message) => {
if (message.name) {
return {
role: message.role,
name: message.name,
content: message.content,
};
} else {
return {
role: message.role,
content: message.content,
};
}
});
// Check if this is GPT-5
const isGPT5 = this.model && this.model.toLowerCase().includes('gpt-5');
if (isGPT5) {
// GPT-5 uses different format: input instead of messages
// Combine messages into a single input string
const input = messages
.map(msg => `${msg.role}: ${msg.content}`)
.join('\n');
const params = {
model: this.model,
input: input,
reasoning: { effort: this.effort },
...(this.maxTokens && { max_output_tokens: this.maxTokens }),
};
return params;
} else {
// Standard chat completion format for GPT-4 and others
const params = {
model: this.model,
messages: messages,
...(this.temperature && { temperature: this.temperature }),
...(this.numberOfOutputs && { n: this.numberOfOutputs }),
...(this.maxTokens && { max_tokens: this.maxTokens }),
};
return params;
}
}
}
class CohereInput extends ChatGPTInput {
constructor(systemMessage, options = {}) {
super(systemMessage, options);
this.web = options.web || false;
this.model = options.model || 'command-r';
}
addUserMessage(prompt) {
this.messages.push(new ChatGPTMessage(prompt, 'User'));
}
addAssistantMessage(prompt) {
this.messages.push(new ChatGPTMessage(prompt, 'Chatbot'));
}
addSystemMessage(prompt) {
this.messages.push(new ChatGPTMessage(prompt, 'System'));
}
getChatInput() {
if (this.messages.length < 1) {
throw new Error("At least one message is required for Cohere API");
}
const chatHistory = [];
const latestMessage = this.messages[this.messages.length - 1];
for (let i = 0; i < this.messages.length - 1; i++) {
const message = this.messages[i];
chatHistory.push({
'id': i,
'role': message.role,
'message': message.content
});
}
const params = {
'model': this.model,
'message': latestMessage.content,
'chat_history': chatHistory,
...(this.web && {'connectors': [{id: 'web-search'}]}),
};
return params;
}
}
class MistralInput extends ChatGPTInput {
constructor(systemMessage, options = {}) {
super(systemMessage, options);
this.model = options.model || 'mistral-medium';
}
getChatInput() {
// Prepare the messages in the expected format
const messages = this.messages.map((message) => ({
role: message.role,
content: message.content,
}));
// Construct Mistral input parameters
const params = {
model: this.model,
messages: messages,
};
return params;
}
}
class GeminiInput extends ChatModelInput {
constructor(systemMessage, options = {}) {
super(options);
this.messages = [];
this.maxOutputTokens = options.maxTokens
this.temperature = options.temperature
if (systemMessage && typeof systemMessage === 'string') {
this.addUserMessage(systemMessage);
this.addModelMessage('I will response based on the provided instructions.');
}
}
addUserMessage(text) {
this.messages.push({
role: "user",
parts: [{ text }]
});
}
addModelMessage(text) {
this.messages.push({
role: "model",
parts: [{ text }]
});
}
addAssistantMessage(text) {
this.addModelMessage(text);
}
getChatInput() {
return {
contents: this.messages,
generationConfig: {
...(this.temperature && { temperature: this.temperature }),
...(this.maxOutputTokens && { maxOutputTokens: this.maxOutputTokens }),
}
};
}
cleanMessages() {
this.messages = [];
}
deleteLastMessage(message) {
if (this.messages.length > 0) {
this.messages.splice(-1, 1);
return true;
}
return false;
}
}
class AnthropicInput extends ChatModelInput {
constructor(system, options = {}) {
super(options);
this.system = system;
this.model = options.model || 'claude-3-sonnet-20240229';
this.maxTokens = options.maxTokens || 800;
this.temperature = options.temperature || 1.0;
this.messages = [];
}
addUserMessage(text) {
this.messages.push({
role: "user",
content: text
});
}
addAssistantMessage(text) {
this.messages.push({
role: "assistant",
content: text
});
}
getChatInput() {
return {
system: this.system,
model: this.model,
messages: this.messages,
max_tokens: this.maxTokens,
temperature: this.temperature,
};
}
}
class ChatLLamaInput extends ChatModelInput {
constructor(systemMessage, options = {}) {
super(options);
if (
systemMessage instanceof ChatGPTMessage &&
systemMessage.isSystemRole()
) {
this.system_prompt = systemMessage.content;
} else if (typeof systemMessage === 'string') {
this.system_prompt = systemMessage;
} else {
throw new Error(
'The input type should be system to define the bot theme or instructions.'
);
}
if (!options.model) {
console.log(
'warning: send the model name or use the tuned llama inputs (LLamaReplicateInput, LLamaAWSInput)'
);
}
this.model = options.model || '';
this.version = options.version || '';
this.temperature = options.temperature || 0.5;
this.max_new_tokens = options.maxTokens || 500;
this.top_p = options.top_p || 1;
this.prompt = options.prompt || '';
this.repetition_penalty = options.repetition_penalty || 1;
this.debug = options.debug || false;
}
addUserMessage(prompt) {
if (this.prompt) {
this.prompt += `\nUser: ${prompt}`;
} else {
this.prompt = `User: ${prompt}`;
}
}
addAssistantMessage(prompt) {
if (this.prompt) {
this.prompt += `\nAssistant: ${prompt}`;
} else {
this.prompt = `Assistant: ${prompt}`;
}
}
cleanMessages() {
this.prompt = '';
}
getChatInput() {
return {
model: this.model,
inputData: {
input: {
prompt: this.prompt,
system_prompt: this.system_prompt,
max_new_tokens: this.max_new_tokens,
temperature: this.temperature,
top_p: this.top_p,
repetition_penalty: this.repetition_penalty,
debug: this.debug,
},
},
};
}
}
class LLamaReplicateInput extends ChatLLamaInput {
constructor(systemMessage, options = {}) {
options.model =
options.model || config.models.replicate.llama['13b'];
options.version = options.version;
super(systemMessage, options);
this.top_k = options.top_k || null;
this.top_p = options.top_p || null;
this.min_new_tokens = options.min_new_tokens || null;
this.system_prompt = options.system_prompt || null;
this.repetition_penalty = options.repetition_penalty || null;
}
getChatInput() {
if (this.version == null || this.version == '') {
this.version =
config.models.replicate.llama[`${this.model}-version`];
}
var myData = {
model: this.model,
inputData: {
version: this.version,
input: {
prompt: this.prompt,
max_new_tokens: this.max_new_tokens,
temperature: this.temperature,
debug: this.debug,
},
},
};
if (this.top_k) myData.inputData.input.top_k = this.top_k;
if (this.top_p) myData.inputData.input.top_p = this.top_p;
if (this.system_prompt)
myData.inputData.input.system_prompt = this.system_prompt;
if (this.min_new_tokens)
myData.inputData.input.min_new_tokens = this.min_new_tokens;
if (this.repetition_penalty)
myData.inputData.input.repetition_penalty =
this.repetition_penalty;
return myData;
}
}
class LLamaSageInput extends ChatModelInput {
constructor(systemMessage, parameters = {}, options = {}) {
super(options);
if (
systemMessage instanceof ChatGPTMessage &&
systemMessage.isSystemRole()
) {
this.messages = [systemMessage];
} else if (typeof systemMessage === 'string') {
this.messages = [new ChatGPTMessage(systemMessage, 'system')];
} else {
throw new Error(
'The input type should be system to define the chatbot theme or instructions.'
);
}
this.parameters = parameters;
}
addMessage(message) {
this.messages.push(message);
}
addUserMessage(prompt) {
this.messages.push(new ChatGPTMessage(prompt, 'user'));
}
addAssistantMessage(prompt) {
this.messages.push(new ChatGPTMessage(prompt, 'assistant'));
}
addSystemMessage(prompt) {
this.messages.push(new ChatGPTMessage(prompt, 'system'));
}
cleanMessages() {
if (this.messages.length > 1) {
const firstMessage = this.messages[0];
this.messages = [firstMessage];
}
}
deleteLastMessage(message) {
for (let i = this.messages.length - 1; i >= 0; i--) {
const currentMessage = this.messages[i];
if (
currentMessage.content === message.content &&
currentMessage.role === message.role
) {
this.messages.splice(i, 1);
return true;
}
}
return false;
}
getChatInput() {
return {
parameters: this.parameters,
inputs: [
this.messages.map((msg) => ({
role: msg.role,
content: msg.content,
})),
],
};
}
}
class NvidiaInput extends ChatModelInput {
constructor(systemMessage, options = {}) {
super(options);
if (typeof systemMessage === 'string') {
this.messages = [{ role: 'system', content: systemMessage }];
} else {
this.messages = [];
}
this.model = options.model || 'deepseek-ai/deepseek-r1';
this.temperature = options.temperature || 0.7;
this.maxTokens = options.maxTokens || 1024;
this.topP = options.topP || 1.0;
this.presencePenalty = options.presencePenalty || 0;
this.frequencyPenalty = options.frequencyPenalty || 0;
this.stream = options.stream || false;
}
addUserMessage(text) {
this.messages.push({ role: 'user', content: text });
}
addAssistantMessage(text) {
this.messages.push({ role: 'assistant', content: text });
}
deleteLastMessage(message) {
for (let i = this.messages.length - 1; i >= 0; i--) {
if (
this.messages[i].role === message.role &&
this.messages[i].content === message.content
) {
this.messages.splice(i, 1);
return true;
}
}
return false;
}
getChatInput() {
return {
model: this.model,
messages: this.messages,
max_tokens: this.maxTokens,
temperature: this.temperature,
top_p: this.topP,
presence_penalty: this.presencePenalty,
frequency_penalty: this.frequencyPenalty,
stream: this.stream
};
}
}
class VLLMInput extends ChatGPTInput {
constructor(systemMessage, options = {}) {
super(systemMessage, options);
this.model = options.model || 'Qwen/Qwen2.5-1.5B-Instruct';
this.maxTokens = options.maxTokens || 1024;
this.temperature = options.temperature || 0.7;
this.top_p = options.top_p || 1.0;
}
getChatInput() {
const messages = this.messages.map((message) => ({
role: message.role,
content: message.content,
}));
return {
model: this.model,
messages: messages,
max_tokens: this.maxTokens,
temperature: this.temperature,
top_p: this.top_p,
};
}
}
module.exports = {
ChatGPTInput,
ChatModelInput,
ChatGPTMessage,
ChatLLamaInput,
LLamaSageInput,
LLamaReplicateInput,
CohereInput,
MistralInput,
GeminiInput,
AnthropicInput,
NvidiaInput,
VLLMInput
};