mirror of
https://github.com/kolbytn/mindcraft.git
synced 2025-04-22 06:02:07 +02:00
commit
bd73aa5a68
6 changed files with 51 additions and 37 deletions
|
@ -1,5 +1,5 @@
|
|||
import { writeFile, readFile, mkdirSync } from 'fs';
|
||||
|
||||
import settings from '../../settings.js';
|
||||
|
||||
export class Coder {
|
||||
constructor(agent) {
|
||||
|
|
|
@ -51,8 +51,12 @@ export class Prompter {
|
|||
throw new Error('Unknown API:', api);
|
||||
|
||||
let embedding = this.prompts.embedding;
|
||||
if (embedding === undefined)
|
||||
if (embedding === undefined) {
|
||||
if (chat.api !== 'ollama')
|
||||
embedding = {api: chat.api};
|
||||
else
|
||||
embedding = {api: 'none'};
|
||||
}
|
||||
else if (typeof embedding === 'string' || embedding instanceof String)
|
||||
embedding = {api: embedding};
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import Anthropic from '@anthropic-ai/sdk';
|
||||
import { strictFormat } from '../utils/text.js';
|
||||
import { getKey } from '../utils/keys.js';
|
||||
|
||||
export class Claude {
|
||||
|
@ -15,36 +16,7 @@ export class Claude {
|
|||
}
|
||||
|
||||
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 === 'assistant') {
|
||||
// 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[0].role !== 'user') {
|
||||
messages.unshift(filler); // anthropic requires user message to start
|
||||
}
|
||||
if (messages.length === 0) {
|
||||
messages.push(filler);
|
||||
}
|
||||
|
||||
const messages = strictFormat(turns);
|
||||
let res = null;
|
||||
try {
|
||||
console.log('Awaiting anthropic api response...')
|
||||
|
|
|
@ -25,9 +25,11 @@ export class Gemini {
|
|||
|
||||
const stop_seq = '***';
|
||||
const prompt = toSinglePrompt(turns, systemMessage, stop_seq, 'model');
|
||||
console.log('Awaiting Google API response...');
|
||||
const result = await model.generateContent(prompt);
|
||||
const response = await result.response;
|
||||
const text = response.text();
|
||||
console.log('Received.');
|
||||
if (!text.includes(stop_seq)) return text;
|
||||
const idx = text.indexOf(stop_seq);
|
||||
return text.slice(0, idx);
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import { strictFormat } from '../utils/text.js';
|
||||
|
||||
export class Local {
|
||||
constructor(model_name, url) {
|
||||
this.model_name = model_name;
|
||||
|
@ -8,12 +10,11 @@ export class Local {
|
|||
|
||||
async sendRequest(turns, systemMessage) {
|
||||
let model = this.model_name || 'llama3';
|
||||
let messages = [{'role': 'system', 'content': systemMessage}].concat(turns);
|
||||
|
||||
let messages = strictFormat(turns);
|
||||
messages.unshift({role: 'system', content: systemMessage});
|
||||
let res = null;
|
||||
try {
|
||||
console.log(`Awaiting local response... (model: ${model})`)
|
||||
console.log('Messages:', messages);
|
||||
res = await this.send(this.chat_endpoint, {model: model, messages: messages, stream: false});
|
||||
if (res)
|
||||
res = res['message']['content'];
|
||||
|
|
|
@ -25,3 +25,38 @@ export function toSinglePrompt(turns, system=null, stop_seq='***', model_nicknam
|
|||
prompt += model_nickname + ": ";
|
||||
return prompt;
|
||||
}
|
||||
|
||||
// ensures stricter turn order for anthropic/llama models
|
||||
// combines repeated messages from the same role, separates repeat assistant messages with filler user messages
|
||||
export function strictFormat(turns) {
|
||||
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 === 'assistant') {
|
||||
// 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[0].role !== 'user') {
|
||||
messages.unshift(filler); // anthropic requires user message to start
|
||||
}
|
||||
if (messages.length === 0) {
|
||||
messages.push(filler);
|
||||
}
|
||||
return messages;
|
||||
}
|
Loading…
Add table
Reference in a new issue