API 사용법 - ssingi/open-source-project GitHub Wiki

API 개요

  • 이 챗봇은 Rasa 프레임워크를 기반으로 하며, 복잡하거나 지능적인 여행 추천을 위해 Google Gemini API를 활용

  • 내부적으로 gemini_url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key={gemini_api_key}" 와 같은 방식으로 Gemini API를 호출

  • gemini_api_keyGoogle Cloud Console에서 발급받아 .env 또는 환경변수로 관리

Gemini API 사용

  • Google Cloud console에서 Gemini API Key 발급 후 Gemini API 호출
Gemini API 호출 예시
class ActionGeminiFallback(Action):
    def name(self) -> Text:
        return "action_gemini_fallback"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        # 사용자의 마지막 메시지(질문) 추출
        user_msg = tracker.latest_message.get("text", "")
        gemini_api_key = os.getenv("GEMINI_API_KEY")
        gemini_url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key={gemini_api_key}"

        if not gemini_api_key:
            dispatcher.utter_message(text="⚠️ Gemini API 키 오류")
            return []

        if not user_msg:
            dispatcher.utter_message(text="⚠️ 유효한 질문이 없습니다")
            return []

        # Gemini API 요청 헤더 및 데이터 구성
        headers = {"Content-Type": "application/json"}
        data = {"contents": [{"parts": [{"text": user_msg}]}]}

        try:
            # Gemini API에 POST 요청
            response = requests.post(gemini_url, headers=headers, json=data, timeout=30)
            if response.status_code == 200:
                # 응답에서 답변 텍스트 추출
                res_json = response.json()
                gemini_answer = res_json.get("candidates", [{}])[0].get("content", {}).get("parts", [{}])[0].get("text", "답변을 생성할 수 없습니다.")
                
                # 답변이 2000자를 넘을 경우 분할하여 전송 (디스코드 메시지 제한 대응)
                chunks = split_text(f"Gemini의 답변: {gemini_answer}")
                for chunk in chunks:
                    dispatcher.utter_message(text=chunk)
                    
            else:
                error_msg = f"⚠️ API 호출 실패 (코드: {response.status_code})"
                dispatcher.utter_message(text=error_msg[:2000])
                
        except Exception as e:
            error_msg = f"🔌 연결 오류: {str(e)}"
            dispatcher.utter_message(text=error_msg[:2000])
            
        return []

Discord Developer Portal 사용

  • Bot 탭에서 Presence Intent / Server Members Intent / Message Content Intent 설정 켜두기 및 Token 발급

  • OAuth2 탭에서 아래의 설정 대로 한 후 url 생성

OAuth2 설정

image

image

  • 사용할 Discord 서버에 초대

Discord 봇과의 연동

  • Discord 메시지를 수신하면 Rasa NLU에 전달하여 intent를 판별

  • Rasa가 처리 불가능한 질문은 fallback으로 Gemini API에 넘기고, 응답 결과를 Discord 채널에 전송

에러 처리 및 제한사항

  • Gemini API 호출 실패 시 재시도 로직 또는 사용자에게 에러 메시지를 안내

  • API 사용량 제한(쿼터) 및 비용 관련은 처음 사용시 90일 혹은 특정 크레딧까지는 무료로 사용이 가능

⚠️ **GitHub.com Fallback** ⚠️