File size: 2,570 Bytes
567f740
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
const axios = require('axios');

class DeepInfraHandler {
    constructor() {
        this.API_URL = 'https://api.deepinfra.com/v1/openai/chat/completions';
        this.headers = {
            'Accept': 'text/event-stream',
            'Accept-Encoding': 'gzip, deflate, br, zstd',
            'Content-Type': 'application/json',
            'Connection': 'keep-alive',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
        };
    }

    _preparePayload(params) {
        return {
            model: params.model,
            messages: params.messages,
            temperature: params.temperature || 0.7,
            max_tokens: params.max_tokens || 4096,
            top_p: params.top_p || 1.0,
            frequency_penalty: params.frequency_penalty || 0.0,
            presence_penalty: params.presence_penalty || 0.0,
            stop: params.stop || [],
            stream: params.stream || false
        };
    }

    async generateCompletion(params) {
        const payload = this._preparePayload(params);

        try {
            if (payload.stream) {
                return this._handleStreamingResponse(payload);
            } else {
                return this._handleRegularResponse(payload);
            }
        } catch (error) {
            throw new Error(`API request failed: ${error.message}`);
        }
    }

    async _handleRegularResponse(payload) {
        const response = await axios.post(this.API_URL, payload, {
            headers: this.headers
        });
        return response.data;
    }

    async* _handleStreamingResponse(payload) {
        const response = await axios.post(this.API_URL, payload, {
            headers: this.headers,
            responseType: 'stream'
        });

        for await (const chunk of response.data) {
            const lines = chunk.toString().split('\n');
            for (const line of lines) {
                if (line.startsWith('data: ')) {
                    try {
                        const content = JSON.parse(line.slice(6));
                        if (content === '[DONE]') continue;
                        const deltaContent = content?.choices?.[0]?.delta?.content;
                        if (deltaContent) yield deltaContent;
                    } catch (error) {
                        continue;
                    }
                }
            }
        }
    }
}

module.exports = { DeepInfraHandler };