Spermflow 2

Инструкция по настройке: https://rentry.co/spermflow
Скрипт использовать тот, что ниже

const axios = require('axios');
const http = require('http');

// View our quick start guide to get your API key:
// https://www.voiceflow.com/api/dialog-manager#section/Quick-Start
const apiKey = '';

const userID = 'user_123'; // Unique ID used to track conversation state

const readBody = (res, json, onData) => new Promise((resolve, reject) => {
    let buffer = '';

    res.on('data', chunk => {
        onData?.(chunk.toString());
        buffer += chunk;
    });

    res.on('end', () => {
        try {
            if (json) buffer = JSON.parse(buffer);
            resolve(buffer);
        } catch (e) {
            console.error(buffer);
            reject(e);
        }
    });
})

function isObject (value) {  
    return Object.prototype.toString.call(value) === '[object Object]'
}

async function startInteract(messages) {
    return new Promise(async (resolve, reject) => {
        const body = {
            action: {
            type: 'text',
            payload: messages,
            },
        };
    try {
        // Start a conversation
        const response = await axios({
            method: 'POST',
            baseURL: 'https://general-runtime.voiceflow.com',
            url: `/state/user/${userID}/interact`,
            headers: {
            Authorization: apiKey,
            },
            data: body,
        });
        // Log the response
        if(!response.data[2]?.payload?.message) 
            console.log(response.data)
        resolve(response.data[2]?.payload?.message)
    }
    catch(e) {
        reject(e)
    }
    })
}

function preparePrompt(messages) {
    return messages.filter(m => m.content?.trim()).map(m => {
        let author = '';
        switch (m.role) {
            case 'user': author = 'Human'; break;
            case 'assistant': author = 'Assistant'; break;
            case 'system': author = 'System Note'; break;
            default: author = m.role; break;
        }

        return `${author}: ${m.content.trim()}`;
    }).join('\n') + `\nAssistant: `;
}

async function main() {
    const server = http.createServer(async (req, res) => {
        if (req.method.toUpperCase() === 'POST') {
            if(!apiKey) {
                console.log("Нет API ключа.")
                res.end()
                return
            }
            const body = await readBody(req, true);
            const [, modelName] = req.url.split('/');
            let {
                messages,
            } = body;
            res.setHeader('Content-Type', 'application/json');
            const id = `chatcmpl-${(Math.random().toString(36).slice(2))}`;
            const created = Math.floor(Date.now() / 1000);
            if(modelName == "anthropic") {

                messages = preparePrompt(messages)
            }
            else messages = JSON.stringify(messages)
            let result = ""
            console.log("Ожидаем ответа...")
            while(!result) {
                try {
                    result = await startInteract(messages);
                    console.log("Ответ Voiceflow:\n\n", result)
                } catch (error) {
                    result = error
                }
            }
            if(isObject(result)) {
                result = JSON.stringify(result)
            }
            else if(result.startsWith("{")) {
                try {
                    result = JSON.parse(result)             
                    if(result.content) result = result.content
                    else if(result.assistant) result = result.assistant
                }
                catch(e) {console.log(e)}
            }

            else { result = result.replace(/\\n/g, ' \n').replace(/\\"/g, '"') }
            res.write(JSON.stringify({
                id, created,
                object: 'chat.completion',
                model: "GPT-4",
                choices: [{
                    message: {
                        role: 'assistant',
                        content: result,
                    },
                    finish_reason: 'stop',
                    index: 0,
                }]
            }))
            res.end();
        } else {
            res.setHeader('Content-Type', 'application/json');
            res.write(JSON.stringify({
                object: 'list',
                data: [
                    { id: 'GPT-4', object: 'model', created: Date.now(), owned_by: 'OpenAI', permission: [], root: 'GPT-4', parent: null },
                    { id: 'Claude', object: 'model', created: Date.now(), owned_by: 'Anthropic', permission: [], root: 'Claude', parent: null },
                ]
            }));
        }
        res.end();
    });

    server.listen(5006, '0.0.0.0', () => {
        console.log('Voiceflow с промптами в формате GPT-4: http://127.0.0.1:5006/\n' +
                    'Промпты в формате Claude (human/assistant): http://127.0.0.1:5006/anthropic');
    });
}

main().catch(console.error);
Edit Report
Pub: 01 Aug 2023 06:41 UTC
Views: 17224