@nomyx/assistant
Version:
A powerful assistant library and cli for your AI projects. works with Vertex AI (Claude and Gemini)
125 lines (124 loc) • 4.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.convertMessages = convertMessages;
exports.convertFunctionCall = convertFunctionCall;
exports.convertToolSchema = convertToolSchema;
exports.convertParameters = convertParameters;
exports.convertParameterDefinition = convertParameterDefinition;
exports.convertToolCall = convertToolCall;
exports.validateToolCall = validateToolCall;
exports.convertToolCalls = convertToolCalls;
exports.convertUsage = convertUsage;
const types_1 = require("./types");
function convertMessages(messages, model) {
const supportsSystemMessages = !types_1.MODELS_WITHOUT_SYSTEM_MESSAGES.includes(model);
return messages.map(msg => {
let convertedMessage = {
content: msg.content,
};
switch (msg.role) {
case 'system':
convertedMessage.role = supportsSystemMessages ? 'system' : 'user';
if (!supportsSystemMessages) {
convertedMessage.content = `System: ${msg.content}`;
}
break;
case 'user':
case 'assistant':
convertedMessage.role = msg.role;
break;
case 'function':
convertedMessage = {
role: 'function',
content: msg.content,
name: msg.name || 'unknown',
};
break;
default:
console.warn(`Unknown role "${msg.role}" encountered. Treating as "user".`);
convertedMessage.role = 'user';
}
if (msg.role === 'assistant' && 'function_call' in msg && msg.function_call) {
convertedMessage.function_call = convertFunctionCall(msg.function_call);
}
return convertedMessage;
});
}
function convertFunctionCall(functionCall) {
return {
name: functionCall.name,
arguments: JSON.stringify(functionCall.arguments)
};
}
function convertToolSchema(schema) {
return {
name: schema.name,
description: schema.description,
parameters: {
type: 'object',
properties: convertParameters(schema.parameters.properties),
required: schema.parameters.required,
},
};
}
function convertParameters(params) {
const result = {};
for (const [key, value] of Object.entries(params)) {
result[key] = convertParameterDefinition(value);
}
return result;
}
function convertParameterDefinition(param) {
const result = { type: param.type };
if (param.description)
result.description = param.description;
if (param.enum)
result.enum = param.enum;
if (param.items)
result.items = convertParameterDefinition(param.items);
if (param.properties)
result.properties = convertParameters(param.properties);
if (param.required)
result.required = param.required;
return result;
}
function convertToolCall(call) {
try {
const convertedCall = {
name: call.function.name,
arguments: JSON.parse(call.function.arguments || '{}'),
};
validateToolCall(convertedCall);
return convertedCall;
}
catch (error) {
throw new Error(`Failed to convert tool call: ${error instanceof Error ? error.message : String(error)}`);
}
}
function validateToolCall(toolCall) {
if (typeof toolCall.name !== 'string' || toolCall.name.trim() === '') {
throw new Error('Invalid tool call: name must be a non-empty string');
}
if (typeof toolCall.arguments !== 'object' || toolCall.arguments === null) {
throw new Error('Invalid tool call: arguments must be an object');
}
}
function convertToolCalls(toolCalls) {
if (!toolCalls || toolCalls.length === 0)
return [];
return toolCalls.map(call => {
try {
return convertToolCall(call);
}
catch (error) {
return null;
}
}).filter((call) => call !== null);
}
function convertUsage(usage) {
return {
promptTokens: usage?.prompt_tokens || 0,
completionTokens: usage?.completion_tokens || 0,
totalTokens: usage?.total_tokens || 0,
};
}