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/
저자
삼플
게시일
2024-09-23
라이선스
CC BY-NC-SA 4.0