목차
Table of Contents |
---|
...
텍스트 AI
GPT 예제
- @waylaidwanderer/fetch-event-source를 활용한 Node Express server 예제입니다.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
const { fetch, Headers, Request, Response } = require('fetch-undici'); if (!globalThis.fetch) { globalThis.fetch = fetch; globalThis.Headers = Headers; globalThis.Request = Request; globalThis.Response = Response; } module.exports = require('@waylaidwanderer/fetch-event-source'); |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
const express = require('express'); const bodyParser = require('body-parser'); const { fetchEventSource } = require('./modules/FetchEventSource'); const GPT_API_URL = ''; // API URL ex) 'https://api.openai.com/v1/chat/completions' const GPT_API_KEY = ''; // API KEY const app = express(); const router = express.Router(); router.post('/request', (request, response) => { const bodyData = Object.assign({}, request.body, { model: 'gpt-3.5-turbo', stream: true }); requestGPT(response, bodyData) .then(() => response.end()) .catch((error) => response.status(error.status).json(error).end()); }); /** * GPT 서버로 요청합니다. * @param {Response} response * @param {Object} bodyData * @returns {Promise} */ function requestGPT(response, bodyData) { const abortController = new AbortController(); return new Promise(async (resolve, reject) => { try { await fetchEventSource(GPT_API_URL, { method: 'post', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${GPT_API_KEY}` // OpenAI // 'Api-Key': GPT_API_KEY` // Azure OpenAI }, body: JSON.stringify(bodyData), signal: abortController.signal, onopen: async (openResponse) => { if (openResponse.status === 200) { response.on('close', () => { abortController.abort(); resolve(); }); response.set({ 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-Type': 'text/event-stream' }); response.flushHeaders(); return; } let error; try { const json = await openResponse.json(); error = json; } catch (e) { error = e; } error.status = openResponse.status; throw error; }, onclose: () => resolve(), onerror: (error) => { reject(error); throw error; }, onmessage: (message) => { if (!message.data || message.event === 'ping') { return; } response.write('data:' + message.data + '\n\n'); }, }); } catch (e) { reject(e); } }); } app.use(bodyParser.json()); app.use('/', router); app.listen(8080); |
...
하이퍼클로바 X 예제
- axios를 활용한 Node Express server 예제입니다.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
const express = require('express'); const axios = require('axios'); const bodyParser = require('body-parser'); const DALLEHCX_API_URL = ''; // API URL - const DALLE_API_KEY = ''; // API KEY const CLOVA Studio에서 url 확인 ex)https://clovastudio.apigw.ntruss.com/testapp/v1/chat-completions/HCX-003 const HCX_API_KEY = ''; // API KEY const HCX_GATEWAY_KEY = '';// GATEWAY KEY const app = express(); const router = express.Router(); router.post('/request', (request, response) => { const bodyData = request.body; requestDallerequestHCX(response, bodyData) .then(() => response.end()) .catch((error)err => response.status(error.status).json(error).end()); }); /** * DALL·E 서버로 요청을 합니다. * @param {Object} body 전송할 Data Object * @param {Response} res 클라이언트 응답 객체 * @returns {Promise} */ function requestDALLEServer(res, body) { const source = axios.CancelToken.source(); const url = DALLE_URL; return new Promise((resolve, reject) => { try { console.error('[ERROR] requestHCX chat completion failed: ' + err); return response.status(err.status || 500).json(err).end(); }); }); /** * 하이퍼클로바 X 서버로 요청합니다. * @param {Response} response * @param {Object} body * @returns {Promise} */ function requestHCX(response, bodyData) { const source = axios.CancelToken.post(url, body, {source(); const url headers: { = HCX_API_URL; const headers= { 'Content-Type': 'application/json', 'Authorization'Accept': `Bearer ${DALLE'text/event-stream', 'X-NCP-CLOVASTUDIO-API-KEY': HCX_API_KEY}`, 'X-NCP-APIGW-API-KEY': HCX_GATEWAY_KEY } return new Promise(async }(resolve, reject) => { try { responseType: 'stream', axios.post(url, bodyData, { cancelToken: source.token headers, }).then(response => { responseType: 'stream', // 응답 스트림을 클라이언트에 파이프 response.data.pipe(res);cancelToken: source.token }).catchthen(errorhcxRes => { // 요청 중 에러가 발생한 경우hcxRes.data.pipe(response); }).catch(reject); reject({ response.on('close', () => { status: error.response ? error.response.status : 500,source.cancel('요청을 취소합니다.'); resolve(); message: error.message }); } catch }(e); { }reject(e); } // 클라이언트의 연결이 끊어진 경우 요청을 취소 res.on('close', () => { source.cancel('요청을 취소합니다.'); // 클라이언트의 연결이 끊어진 경우, Promise를 완료 resolve(); }}); } app.use(bodyParser.json()); app.use('/', router); app.listen(8080); |
Gemini 예제
- axios를 활용한 Node Express server 예제입니다.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
const express = require('express'); const axios = require('axios'); const bodyParser = require('body-parser'); const GEMINI_URL = ''; // API URL ex) 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:streamGenerateContent' const GEMINI_PARAM = ''; // API PARAMETER ex) 'alt=sse&' const GEMINI_KEY = ''; // API KEY const app = express(); const router = express.Router(); router.post('/request', (request, response) => { const bodyData = Object.assign({}, request.body); } catch (erequestGeminiServer(response, bodyData) { .then(() // 예외 발생 시 reject 호출=> response.end()) .catch((err) => response.status(err.status reject(e); } }); } app.use(bodyParser.json()); app.use('/', router); app.listen(8080); |
- 하이퍼클로바 X
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
const express = require('express'); const axios = require('axios'); const bodyParser = require('body-parser'); const HCX_API_URL = ''; // API URL - CLOVA Studio에서 url 확인 ex)https://clovastudio.apigw.ntruss.com/testapp/v1/chat-completions/HCX-003 const HCX_API_KEY = ''; // API KEY const HCX_GATEWAY_KEY = '';// GATEWAY KEY const app = express(); const router = express.Router(); router.post('/request', (request, response) =>|| 500).json(err).end()); }); /** * Gemini 서버로 요청을 합니다. * @param {Response} response * @param {Object} bodyData * @returns {Promise} */ function requestGeminiServer(response, bodyData) { const url = GEMINI_URL; const key = GEMINI_KEY; const param = GEMINI_PARAM; const urlWithParam = `${url}?${param}key=${key}`; const source = axios.CancelToken.source(); return new Promise((resolve, reject) => { try { axios.post(urlWithParam, bodyData, { headers: { 'Content-Type': 'application/json' }, responseType: 'stream', cancelToken: source.token }).then(geminiRes => { geminiRes.data.pipe(response); }).catch(reject); response.on('close', () => { source.cancel('요청을 취소합니다.'); resolve(); }); } catch (e) { reject(e); } }); } app.use(bodyParser.json()); app.use('/', router); app.listen(8080); |
...
이미지 생성 AI
DALL-E 예제
- axios를 활용한 Node Express server 예제입니다.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
const express = require('express'); const axios = require('axios'); const bodyParser = require('body-parser'); const DALLE_URL = ''; // API URL ex) 'https://api.openai.com/v1/images/generations' const DALLE_API_KEY = ''; // API KEY const app = express(); const router = express.Router(); router.post('/request', (request, response) => { const bodyData = request.body; requestDALLEServer(response, bodyData) .then((data) => response.json(data)) .catch((error) => response.status(error.status).json(error).end()); }); /** * DALL·E 서버로 요청을 합니다. * @param {Response} response * @param {Object} bodyData * @returns {Promise} */ function requestDALLEServer(response, bodyData) { const bodyDatasource = request.bodyaxios.CancelToken.source(); const requestHCX(response, bodyData) url = DALLE_URL; return new .thenPromise((resolve, reject) => response.end()) > { .catch(err => try { console.error('[ERROR] requestHCX chat completion failed: ' + err); axios.post(url, bodyData, { return response.status(err.status || 500).json(err).end(); headers: { }); }); /** * 하이퍼클로바 X 서버로 요청합니다. * @param {Response} response * @param {Object} body * @returns {Promise} */ function requestHCX(response, bodyData) { 'Content-Type': 'application/json', const source = axios.CancelToken.source();'Authorization': `Bearer ${DALLE_API_KEY}` const url = HCX_API_URL; const headers= { 'Content-Type': 'application/json', }, 'Accept': 'text/event-stream', 'X-NCP-CLOVASTUDIO-API-KEY': HCX_API_KEY, 'X-NCP-APIGW-API-KEY': HCX_GATEWAY_KEY }cancelToken: source.token return new Promise(async (resolve, reject}).then(res => { try { resolve(res.data); axios}).postcatch(url, bodyData,error => { headers,reject({ responseType: 'stream', status: error.response ? error.response.status : 500, cancelToken: source.token message: }).then(hcxRes => {error.message hcxRes.data.pipe(response}); }).catch(reject); response.on('close', () => { source.cancel('요청을 취소합니다.'); resolve(); }); } catch (e) { reject(e); } }); } app.use(bodyParser.json()); app.use('/', router); app.listen(8080); |
...