Συζητήστε με μοντέλα γλωσσών με AIMODEL(), NEWAIMODel() και AIPARSER()
Το total5 δεν περιλαμβάνει σύνδεση με κανέναν πάροχο. Σας δίνει τρία κομμάτια που λειτουργούν μαζί:
- Το
NEWAIMODEL('name', config, driver)καταχωρίζει τον driver ενός ή περισσότερων μοντέλων (το'a,b'καταχωρίζει τον ίδιο driver για δύο ονόματα). Ο driver είναιfunction(ai, done): τοai.payloadέχειmodel,messages,tools,promptκαιthink, τοai.configείναι η ρύθμιση και τοai.options.streamείναι η συνάρτηση που πέρασε ο καλών στοstream()(ήundefined). Απαντήστε μεdone(error, response). - Το
AIMODEL('name')ξεκινά ένα αίτημα για ένα καταχωρισμένο μοντέλο και επιστρέφει έναν builder. Ταsystem(text),user(text)καιassistant(text)προσθέτουν ένα μήνυμα, ταprompt(text),tool(definition)καιthink()συμπληρώνουν το υπόλοιπο payload και τοconfigure({ ... })προσθέτει στοai.configμόνο για αυτή την κλήση. Ολοκληρώστε το μεcallback(fn),await promise($)ήstream(fn)· ο driver εκτελείται μετά τον τρέχοντα γύρο, οπότε μπορείτε πρώτα να αλυσοδέσετε τα πάντα. - Το
AIPARSER(provider)επιστρέφει έναν parser για την απάντηση ροής ενός παρόχου (ο πηγαίος κώδικας τουtotal5γνωρίζει ταopenai,claude/anthropic,gemini/google,ollamaκαιopenai_responsesκαι διαβάζει οποιοδήποτε άλλο όνομα ως γενική μορφή· παρακάτω εκτελείται μόνο τοopenai). Τοwrite(chunk)δέχεται κομμάτια της ροής (κρατά τις ατελείς γραμμές μέχρι το επόμενο κομμάτι), τοend()την ολοκληρώνει και τα δύο επιστρέφουν{ content, thinking, tools, reasoning }. Τοparser.on('content', fn)καλείται με κάθε μέρος του κειμένου καθώς φτάνει.
Ένα μοντέλο που δεν έχει καταχωριστεί απαντά με το σφάλμα AI model not found.. Το παράδειγμα καταγράφει έναν τοπικό οδηγό που επιστρέφει μια απάντηση από τα μηνύματα που παρέχονται.
NEWAIMODEL('echo', { prefix: 'Echo' }, function(ai, done) {
const last = ai.payload.messages.filter(n => n.role === 'user').pop();
const text = ai.config.prefix + ': ' + (last ? last.content : '');
// A real driver would send ai.payload to the provider and send the pieces to ai.options.stream
if (ai.options.stream) {
for (const word of text.split(' '))
ai.options.stream(word + ' ');
}
done(null, { content: text, roles: ai.payload.messages.map(n => n.role), tools: ai.payload.tools.length, think: !!ai.payload.think });
});exports.install = function() {
ROUTE('POST /ask/', ask);
ROUTE('GET /ask-config/', askconfig);
ROUTE('GET /ask-stream/', askstream);
ROUTE('GET /ask-missing/', missing);
ROUTE('GET /parse/', parse);
};
async function ask($) {
const response = await AIMODEL('echo').system('You are brief.').user($.body.question).tool({ name: 'weather' }).think().promise($);
$.json(response);
}
function askconfig($) {
AIMODEL('echo').user('hello').configure({ prefix: 'Custom' }).callback($.callback());
}
function askstream($) {
const parts = [];
AIMODEL('echo').user('one two three').stream(part => parts.push(part)).callback(function(err, response) {
$.json({ parts: parts, content: response.content });
});
}
function missing($) {
AIMODEL('nobody').user('hi').callback($.callback());
}
function parse($) {
const parser = AIPARSER('openai');
const events = [];
parser.on('content', e => events.push(e.delta));
// the second piece starts in the middle of a line
parser.write('data: {"choices":[{"delta":{"content":"Hel"}}]}\n\ndata: {"choices":[{"delta":{"con');
parser.write('tent":"lo"}}]}\n\ndata: [DONE]\n');
const output = parser.end();
$.json({ output: output, events: events });
}