삼플 사이트
1201 단어
6 분
메신저봇 gemini module 공유
아래의 코드를 복사후 글로벌 모듈에 gemini.js 파일을 만들고, 모듈을 사용하면 쉽게 gemini Api를 쉽고 간단하게 사용할수 있습니다. 자신의 카톡봇에 적용하여 편리한 적용 기능을 구현해보세요!
"use strict";
var gemini = (function() {
var Jsoup = org.jsoup.Jsoup;
var apiKey = null;
var model = null;
var defaultConfig = {
temperature: 0.7,
topK: 1,
topP: 1,
maxOutputTokens: 2048,
stopSequences: []
};
function ConversationSession(sessionId) {
this.sessionId = sessionId;
this.messages = [];
this.createdAt = new Date();
this.lastUsed = new Date();
}
ConversationSession.prototype.addMessage = function(role, content) {
this.messages.push({ role: role, content: content, timestamp: new Date() });
this.lastUsed = new Date();
};
ConversationSession.prototype.getHistory = function() {
return this.messages;
};
ConversationSession.prototype.clearHistory = function() {
this.messages = [];
this.lastUsed = new Date();
};
ConversationSession.prototype.getLastMessage = function() {
return this.messages.length > 0 ? this.messages[this.messages.length - 1] : null;
};
ConversationSession.prototype.removeLastMessage = function() {
return this.messages.pop();
};
function ConversationManager() {
this.sessions = {};
}
ConversationManager.prototype.createSession = function(sessionId) {
if (this.sessions[sessionId]) {
throw new Error("세션 ID가 이미 존재합니다!");
}
var session = new ConversationSession(sessionId);
this.sessions[sessionId] = session;
return session;
};
ConversationManager.prototype.getSession = function(sessionId) {
return this.sessions[sessionId] || null;
};
ConversationManager.prototype.deleteSession = function(sessionId) {
delete this.sessions[sessionId];
};
ConversationManager.prototype.getAllSessions = function() {
return Object.values(this.sessions);
};
ConversationManager.prototype.cleanupOldSessions = function(maxAge) {
var now = new Date();
for (var sessionId in this.sessions) {
if (this.sessions.hasOwnProperty(sessionId)) {
var session = this.sessions[sessionId];
if ((now - session.lastUsed) > maxAge) {
this.deleteSession(sessionId);
}
}
}
};
var conversationManager = new ConversationManager();
function checkSetup() {
if (!apiKey) throw new Error("API 키가 설정되지 않았습니다. setApiKey()를 사용하여 API 키를 설정하세요.");
if (!model) throw new Error("모델이 설정되지 않았습니다. setModel()을 사용하여 모델을 설정하세요.");
}
function makeRequest(url, requestBody) {
try {
var response = Jsoup.connect(url)
.header("Content-Type", "application/json")
.requestBody(requestBody)
.method(org.jsoup.Connection.Method.POST)
.ignoreContentType(true)
.execute()
.body();
return JSON.parse(response);
} catch (e) {
throw new Error("API 요청 중 오류 발생: " + e.message);
}
}
var geminiObj = {};
geminiObj.setApiKey = function(key) {
apiKey = key;
};
geminiObj.setModel = function(modelName) {
model = modelName;
};
geminiObj.setDefaultConfig = function(config) {
for (var key in config) {
if (config.hasOwnProperty(key)) {
defaultConfig[key] = config[key];
}
}
};
geminiObj.createSession = function(sessionId) {
return conversationManager.createSession(sessionId);
};
geminiObj.getSession = function(sessionId) {
return conversationManager.getSession(sessionId);
};
geminiObj.deleteSession = function(sessionId) {
conversationManager.deleteSession(sessionId);
};
geminiObj.getAllSessions = function() {
return conversationManager.getAllSessions();
};
geminiObj.cleanupOldSessions = function(maxAgeInMilliseconds) {
conversationManager.cleanupOldSessions(maxAgeInMilliseconds);
};
geminiObj.chat = function(sessionId, message, params) {
checkSetup();
var session = conversationManager.getSession(sessionId);
if (!session) {
throw new Error("세션을 찾을 수 없습니다. 먼저 세션을 생성하세요.");
}
session.addMessage("user", message);
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + model + ":generateContent?key=" + apiKey;
var config = Object.assign({}, defaultConfig, params);
var requestBody = JSON.stringify({
contents: session.getHistory().map(function(msg) {
return { role: msg.role, parts: [{ text: msg.content }] };
}),
generationConfig: {
temperature: config.temperature,
topK: config.topK,
topP: config.topP,
maxOutputTokens: config.maxOutputTokens,
stopSequences: config.stopSequences
},
safetySettings: config.safetySettings || []
});
var json = makeRequest(url, requestBody);
var aiResponse = json.candidates[0].content.parts[0].text;
session.addMessage("model", aiResponse);
return aiResponse;
};
geminiObj.generate = function(prompt, params) {
checkSetup();
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + model + ":generateContent?key=" + apiKey;
var config = Object.assign({}, defaultConfig, params);
var requestBody = JSON.stringify({
contents: [{ parts: [{ text: prompt }] }],
generationConfig: {
temperature: config.temperature,
topK: config.topK,
topP: config.topP,
maxOutputTokens: config.maxOutputTokens,
stopSequences: config.stopSequences
},
safetySettings: config.safetySettings || []
});
var json = makeRequest(url, requestBody);
return json.candidates[0].content.parts[0].text;
};
geminiObj.listModels = function() {
if (!apiKey) throw new Error("API 키가 설정되지 않았습니다. setApiKey()를 사용하여 API 키를 설정하세요.");
var url = "https://generativelanguage.googleapis.com/v1beta/models?key=" + apiKey;
try {
var response = Jsoup.connect(url)
.ignoreContentType(true)
.execute()
.body();
var json = JSON.parse(response);
if (!json.models) {
throw new Error("모델 데이터를 찾을 수 없습니다.");
}
return json.models;
} catch (e) {
throw new Error("모델 목록 조회 중 오류 발생: " + e.message);
}
};
geminiObj.generateWithImage = function(prompt, imageBase64, params) {
checkSetup();
if (["gemini-1.5-flash", "gemini-1.5-pro", "gemini-1.0-pro-vision"].indexOf(model) === -1) {
throw new Error("이미지 처리는 gemini-1.5-flash, gemini-1.5-pro, gemini-1.0-pro-vision 모델에서만 지원됩니다.");
}
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + model + ":generateContent?key=" + apiKey;
var config = Object.assign({}, defaultConfig, params);
var requestBody = JSON.stringify({
contents: [{
parts: [
{ text: prompt },
{ inlineData: { mimeType: "image/jpeg", data: imageBase64 } }
]
}],
generationConfig: {
temperature: config.temperature,
topK: config.topK,
topP: config.topP,
maxOutputTokens: config.maxOutputTokens,
stopSequences: config.stopSequences
},
safetySettings: config.safetySettings || []
});
var json = makeRequest(url, requestBody);
return json.candidates[0].content.parts[0].text;
};
geminiObj.generateWithFunctionCall = function(prompt, functionDeclarations, params) {
checkSetup();
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + model + ":generateContent?key=" + apiKey;
var config = Object.assign({}, defaultConfig, params);
var requestBody = JSON.stringify({
contents: [{ parts: [{ text: prompt }] }],
generationConfig: {
temperature: config.temperature,
topK: config.topK,
topP: config.topP,
maxOutputTokens: config.maxOutputTokens,
stopSequences: config.stopSequences
},
safetySettings: config.safetySettings || [],
tools: [{ functionDeclarations: functionDeclarations }]
});
var json = makeRequest(url, requestBody);
return json.candidates[0].content;
};
geminiObj.countTokens = function(prompt) {
checkSetup();
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + model + ":countTokens?key=" + apiKey;
var requestBody = JSON.stringify({
contents: [{ parts: [{ text: prompt }] }]
});
var json = makeRequest(url, requestBody);
return json.totalTokens;
};
geminiObj.getModelInfo = function(modelName) {
if (!apiKey) throw new Error("API 키가 설정되지 않았습니다. setApiKey()를 사용하여 API 키를 설정하세요.");
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + modelName + "?key=" + apiKey;
try {
var response = Jsoup.connect(url)
.ignoreContentType(true)
.execute()
.body();
return JSON.parse(response);
} catch (e) {
throw new Error("모델 정보 조회 중 오류 발생: " + e.message);
}
};
geminiObj.batchGenerate = function(prompts, params) {
checkSetup();
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + model + ":batchGenerateContent?key=" + apiKey;
var config = Object.assign({}, defaultConfig, params);
var requestBody = JSON.stringify({
requests: prompts.map(function(prompt) {
return {
contents: [{ parts: [{ text: prompt }] }],
generationConfig: {
temperature: config.temperature,
topK: config.topK,
topP: config.topP,
maxOutputTokens: config.maxOutputTokens,
stopSequences: config.stopSequences
},
safetySettings: config.safetySettings || []
};
})
});
var json = makeRequest(url, requestBody);
return json.generations.map(function(generation) {
return generation[0].content.parts[0].text;
});
};
geminiObj.embedText = function(text) {
checkSetup();
var url = "https://generativelanguage.googleapis.com/v1beta/models/" + model + ":embedContent?key=" + apiKey;
var requestBody = JSON.stringify({
content: { parts: [{ text: text }] }
});
var json = makeRequest(url, requestBody);
return json.embedding.values;
};
return geminiObj;
})();
module.exports = gemini;
- 예시 사용법
const gemini = require('gemini');//모듈 불러오기
gemini.setApiKey("YOUR_API");//API키 설정하기
gemini.setModel("gemini-1.5-flash");//gemini 모델 설정하기
gemini.createSession("세션 이름");//세션 만들기
gemini.chat("세션 이름","넌 누구?");//"세션이름" 세션에서 선택된 모델로 채팅
이 모듈을 활용해서 유저별로 대화를 기억하는 챗봇을 만들수 있습니다.
메신저봇 gemini module 공유
https://blog.sampple.dev/posts/gemini_module/