mirror of
https://github.com/kolbytn/mindcraft.git
synced 2025-07-18 05:55:17 +02:00
82 lines
2.6 KiB
JavaScript
82 lines
2.6 KiB
JavaScript
![]() |
import Anthropic from '@anthropic-ai/sdk';
|
||
|
import { GPT } from './gpt.js';
|
||
|
|
||
|
export class Claude {
|
||
|
constructor(model_name) {
|
||
|
this.model_name = model_name;
|
||
|
if (!process.env.ANTHROPIC_API_KEY) {
|
||
|
throw new Error('Anthropic API key missing! Make sure you set your ANTHROPIC_API_KEY environment variable.');
|
||
|
}
|
||
|
|
||
|
this.anthropic = new Anthropic({
|
||
|
apiKey: process.env["ANTHROPIC_API_KEY"]
|
||
|
});
|
||
|
|
||
|
this.gpt = undefined;
|
||
|
try {
|
||
|
this.gpt = new GPT(); // use for embeddings, ignore model
|
||
|
} catch (err) {
|
||
|
console.warn('Claude uses the OpenAI API for embeddings, but no OPENAI_API_KEY env variable was found. Claude will still work, but performance will suffer.');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
if (msg.role === prev_role && msg.role === 'assitant') {
|
||
|
// 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;
|
||
|
|
||
|
}
|
||
|
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({
|
||
|
model: this.model_name,
|
||
|
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) {
|
||
|
if (this.gpt) {
|
||
|
return await this.gpt.embed(text);
|
||
|
}
|
||
|
// if no gpt, just return random embedding
|
||
|
return Array(1).fill().map(() => Math.random());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|