Advertisement
Amiminoru

ai21_api

Apr 26th, 2023 (edited)
1,203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const https = require('https');
  2. const http = require('http');
  3. const zlib = require('zlib');
  4.  
  5. const API_KEY = `твой ключ`;
  6.  
  7. const options = {
  8.     hostname: 'api.ai21.com',
  9.     port: 443,
  10.     method: 'POST',
  11.     "headers": {
  12.         "authorization": `Bearer ${API_KEY}`,
  13.         "content-type": "application/json",
  14.     },
  15. };
  16.  
  17. const readBody = (res) => new Promise((resolve, reject) => {
  18.     let buffer = '';
  19.  
  20.     res.on('data', chunk => {
  21.         buffer += chunk;
  22.     });
  23.  
  24.     res.on('end', () => {
  25.         try {
  26.             if (res.headers['content-encoding'] === 'gzip') {
  27.                 zlib.gunzip(buffer, (err, data) => {
  28.                     if (err) return reject(err);
  29.  
  30.                     resolve(JSON.parse(data));
  31.                 });
  32.             } else {
  33.                 resolve(JSON.parse(buffer));
  34.             }
  35.         } catch (e) {
  36.             console.error(buffer);
  37.             reject(e);
  38.         }
  39.     });
  40. });
  41.  
  42. const JSON_stringify_fixed = (obj) => JSON.stringify(obj).replace(
  43.     /[\u007f-\uffff]/g,
  44.     (c) => '\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4),
  45. );
  46.  
  47. const request = (path, data) =>
  48.     new Promise((resolve, reject) => {
  49.         const textData = JSON_stringify_fixed(data);
  50.         options.headers['Content-Length'] = textData.length;
  51.         const req = https.request({ ...options, path }, async (res) => {
  52.             try {
  53.                 const body = await readBody(res);
  54.                 console.log(body);
  55.                 const error = body.exception || body.error;
  56.                 if (error) {
  57.                     reject(error);
  58.                 } else {
  59.                     resolve(body);
  60.                 }
  61.             } catch (e) {
  62.                 reject(e);
  63.             }
  64.         });
  65.  
  66.         req.write(textData);
  67.         req.end();
  68.     });
  69.  
  70.  
  71. function preparePrompt(messages) {
  72.     return (messages.filter(m => m.content?.trim()).map(m => {
  73.         let author = '';
  74.         switch (m.role) {
  75.             case 'system': return m.content.trim();
  76.             case 'user': author = 'User'; break;
  77.             case 'assistant': author = 'Assistant'; break;
  78.             default: author = m.role; break;
  79.         }
  80.  
  81.         return `${author}: ${m.content.trim()}`;
  82.     }).join('\n\n') + `\n\nAssistant:`);
  83. }
  84.  
  85. async function generate(data) {
  86.     const prompt = preparePrompt(data.messages);
  87.     const model = "j2-ultra";
  88.     const stopSequences = ["Human:", "You:", "Assistant", "User:", "[System note:", "System note:"];
  89.  
  90.     const requestData = {
  91.         prompt, promptLength: prompt.length,
  92.         model,
  93.         numResults: 1,
  94.         maxTokens: data.max_tokens,
  95.         stopSequences, numStopSequences: stopSequences.length,
  96.         temperature: data.temperature,
  97.         topKReturn: 0,
  98.         topP: 1,
  99.         "frequencyPenalty": {
  100.             "scale": data.frequency_penalty, "applyToWhitespaces": false,
  101.             "applyToPunctuations": false, "applyToNumbers": false,
  102.             "applyToStopwords": false, "applyToEmojis": false
  103.         },
  104.         "presencePenalty": {
  105.             "scale": data.presence_penalty, "applyToWhitespaces": false,
  106.             "applyToPunctuations": false, "applyToNumbers": false,
  107.             "applyToStopwords": false, "applyToEmojis": false
  108.         },
  109.         "countPenalty": {
  110.             "scale": 0, "applyToWhitespaces": false,
  111.             "applyToPunctuations": false, "applyToNumbers": false,
  112.             "applyToStopwords": false, "applyToEmojis": false
  113.         }
  114.     };
  115.     console.log(requestData);
  116.  
  117.     const result = await request(`/studio/v1/${model}/complete`, requestData);
  118.  
  119.     return {
  120.         completion: result.completions[0].data.text,
  121.         completion_tokens: result.completions[0].data.tokens.length,
  122.         prompt_tokens: result.prompt.tokens.length,
  123.     }
  124. }
  125.  
  126. async function main() {
  127.     const server = http.createServer(async (req, res) => {
  128.         res.setHeader('Content-Type', 'application/json');
  129.         if (req.method.toUpperCase() === 'POST') {
  130.             const body = await readBody(req);
  131.             let result;
  132.             try {
  133.                 result = await generate(body);
  134.             } catch (e) {
  135.                 result = { completion: e.toString() };
  136.             }
  137.  
  138.             const id = `chatcmpl-${(Math.random().toString(36).slice(2))}`;
  139.             const created = Math.floor(Date.now() / 1000);
  140.  
  141.             res.write(JSON.stringify({
  142.                 id, created,
  143.                 object: 'chat.completion',
  144.                 model: 'Elehayym',
  145.                 choices: [{
  146.                     message: {
  147.                         role: 'assistant',
  148.                         content: result.completion,
  149.                     },
  150.                     finish_reason: 'stop',
  151.                     index: 0,
  152.                 }],
  153.                 usage: {
  154.                     prompt_tokens: result.prompt_tokens,
  155.                     completion_tokens: result.completion_tokens,
  156.                     total_tokens: result.prompt_tokens + result.completion_tokens,
  157.                 }
  158.             }));
  159.             res.end();
  160.         } else {
  161.             if (req.url === '/' || req.url.startsWith('/?')) {
  162.               res.write(JSON.stringify({
  163.                   proxy_url: `http://127.0.0.1:5004/api`,
  164.               }));          
  165.             } else {
  166.               res.write(JSON.stringify({
  167.                   object: 'list',
  168.                   data: [
  169.                       { id: 'gpt-4', object: 'model', created: Date.now(), owned_by: 'openai', permission: [], root: 'gpt-4', parent: null },
  170.                   ],
  171.                 url: req.url,
  172.               }));  
  173.             }
  174.         }
  175.         res.end();
  176.     });
  177.  
  178.     server.listen(5004, '0.0.0.0', () => {
  179.         console.log(`api: 'http://127.0.0.1:5004/api`);
  180.    });
  181. }
  182.  
  183. main().catch(console.error);
  184.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement