CoolFace
Apppublic

MathProfessionalDevelopment/mathchatbot-v5-simple

sourceHugging Faceapache-2.0updated 22d agoView on Hugging Face
0likes
app.py110 linesDownload Raw Back to root
1import os2import gradio as gr3from dotenv import load_dotenv4from openai import OpenAI5from prompts.initial_prompt import INITIAL_PROMPT6from prompts.main_prompt import MAIN_PROMPT7 8# .env 파일에서 OPENAI_API_KEY 로드9if os.path.exists(".env"):10    load_dotenv(".env")11 12OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")13 14client = OpenAI(api_key=OPENAI_API_KEY)15 16 17 18def gpt_call(history, user_message,19             model="gpt-4o-mini",20             max_tokens=512,21             temperature=0.7,22             top_p=0.95):23    """24    OpenAI ChatCompletion API를 통해 답변을 생성하는 함수.25    - history: [(user_text, assistant_text), ...]26    - user_message: 사용자가 방금 입력한 메시지27    """28    # 1) 시스템 메시지(=MAIN_PROMPT)를 가장 앞에 추가29    messages = [{"role": "system", "content": MAIN_PROMPT}]30    31    # 2) 기존 대화 기록(history)을 OpenAI 형식으로 변환32    #    user_text -> 'user' / assistant_text -> 'assistant'33    for user_text, assistant_text in history:34        if user_text:35            messages.append({"role": "user", "content": user_text})36        if assistant_text:37            messages.append({"role": "assistant", "content": assistant_text})38 39    # 3) 마지막에 이번 사용자의 입력을 추가40    messages.append({"role": "user", "content": user_message})41 42    # 4) OpenAI API 호출43    completion = client.chat.completions.create(44        model=model,45        messages=messages,46        max_tokens=max_tokens,47        temperature=temperature,48        top_p=top_p49    )50    return completion.choices[0].message.content51 52def respond(user_message, history):53    """54    Gradio 상에서 submit할 때 호출되는 함수55    - user_message: 사용자가 방금 친 메시지56    - history: 기존 (user, assistant) 튜플 리스트57    """58    # 사용자가 빈 문자열을 보냈다면 아무 일도 하지 않음59    if not user_message:60        return "", history61 62    # GPT 모델로부터 응답을 받음63    assistant_reply = gpt_call(history, user_message)64 65    # history에 (user, assistant) 쌍 추가66    history.append((user_message, assistant_reply))67 68    # Gradio에서는 (새로 비워질 입력창, 갱신된 history)를 반환69    return "", history70 71##############################72#  Gradio Blocks UI73##############################74with gr.Blocks() as demo:75    gr.Markdown("## Simple Chat Interface")76 77    # Chatbot 초기 상태를 설정78    # 첫 번째 메시지는 (user="", assistant=INITIAL_PROMPT) 형태로 넣어79    # 화면상에서 'assistant'가 INITIAL_PROMPT를 말한 것처럼 보이게 함80    chatbot = gr.Chatbot(81        value=[("", INITIAL_PROMPT)],  # (user, assistant)82        height=50083    )84 85    # (user, assistant) 쌍을 저장할 히스토리 상태86    # 여기서도 동일한 초기 상태를 넣어줌87    state_history = gr.State([("", INITIAL_PROMPT)])88 89    # 사용자 입력90    user_input = gr.Textbox(91        placeholder="Type your message here...",92        label="Your Input"93    )94 95    # 입력이 submit되면 respond() 호출 → 출력은 (새 입력창, 갱신된 chatbot)96    user_input.submit(97        respond,98        inputs=[user_input, state_history],99        outputs=[user_input, chatbot]100    ).then(101        # respond 끝난 뒤, 최신 history를 state_history에 반영102        fn=lambda _, h: h,103        inputs=[user_input, chatbot],104        outputs=[state_history]105    )106 107# 메인 실행108if __name__ == "__main__":109    demo.launch(server_name="0.0.0.0", server_port=7860, share=True)110