CoolFace
Apppublic

CreativeMath/Module1

sourceHugging Faceapache-2.0updated 2y agoView on Hugging Face
0likes
app.py112 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=[{"role": "assistant", "content": INITIAL_PROMPT}],82        height=500,83        type="messages"84    )85 86 87    # (user, assistant) 쌍을 저장할 히스토리 상태88    # 여기서도 동일한 초기 상태를 넣어줌89    state_history = gr.State([("", INITIAL_PROMPT)])90 91    # 사용자 입력92    user_input = gr.Textbox(93        placeholder="Type your message here...",94        label="Your Input"95    )96 97    # 입력이 submit되면 respond() 호출 → 출력은 (새 입력창, 갱신된 chatbot)98    user_input.submit(99        respond,100        inputs=[user_input, state_history],101        outputs=[user_input, chatbot]102    ).then(103        # respond 끝난 뒤, 최신 history를 state_history에 반영104        fn=lambda _, h: h,105        inputs=[user_input, chatbot],106        outputs=[state_history]107    )108 109# 메인 실행110if __name__ == "__main__":111    demo.launch(server_name="0.0.0.0", server_port=7860, share=True)112