mindcraft/src/models/claude.js

75 lines
2.2 KiB
JavaScript
Raw Normal View History

2024-03-23 11:15:53 -05:00
import Anthropic from '@anthropic-ai/sdk';
2024-05-30 18:00:48 -05:00
import { getKey } from '../utils/keys.js';
2024-03-23 11:15:53 -05:00
export class Claude {
2024-04-24 11:28:04 -07:00
constructor(model_name, url) {
2024-03-23 11:15:53 -05:00
this.model_name = model_name;
2024-04-24 11:28:04 -07:00
let config = {};
if (url)
config.baseURL = url;
2024-05-30 18:00:48 -05:00
config.apiKey = getKey('ANTHROPIC_API_KEY');
2024-03-23 11:15:53 -05:00
2024-04-24 11:28:04 -07:00
this.anthropic = new Anthropic(config);
2024-03-23 11:15:53 -05:00
}
async sendRequest(turns, systemMessage) {
let prev_role = null;
let messages = [];
let filler = {role: 'user', content: '_'};
for (let msg of turns) {
if (msg.role === 'system') {
msg.role = 'user';
msg.content = 'SYSTEM: ' + msg.content;
}
2024-04-05 01:59:45 +02:00
if (msg.role === prev_role && msg.role === 'assistant') {
2024-03-23 11:15:53 -05:00
// insert empty user message to separate assistant messages
messages.push(filler);
messages.push(msg);
}
else if (msg.role === prev_role) {
// combine new message with previous message instead of adding a new one
messages[messages.length-1].content += '\n' + msg.content;
}
else {
messages.push(msg);
}
prev_role = msg.role;
}
2024-04-20 22:16:00 -05:00
if (messages.length > 0 && messages[0].role !== 'user') {
messages.unshift(filler); // anthropic requires user message to start
}
2024-03-23 11:15:53 -05:00
if (messages.length === 0) {
messages.push(filler);
}
let res = null;
try {
console.log('Awaiting anthropic api response...')
console.log('Messages:', messages);
const resp = await this.anthropic.messages.create({
2024-04-24 11:28:04 -07:00
model: this.model_name || "claude-3-sonnet-20240229",
2024-03-23 11:15:53 -05:00
system: systemMessage,
max_tokens: 2048,
messages: messages,
});
console.log('Received.')
res = resp.content[0].text;
}
catch (err) {
console.log(err);
res = 'My brain disconnected, try again.';
}
return res;
}
async embed(text) {
2024-04-24 11:28:04 -07:00
throw new Error('Embeddings are not supported by Claude.');
2024-03-23 11:15:53 -05:00
}
}