import os import openai import streamlit as st from dotenv import load_dotenv import boto3 import base64 import datetime import json load_dotenv() OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") client = openai.OpenAI(api_key=OPENAI_API_KEY) dynamodb = boto3.resource( 'dynamodb', aws_access_key_id=os.getenv('AWS_ACCESS_KEY_ID'), aws_secret_access_key=os.getenv('AWS_SECRET_ACCESS_KEY'), region_name='ap-northeast-2' # 원하는 리전으로 변경 ) table = dynamodb.Table('ChatbotConversations') #original_allowed_usernames = os.getenv('ALLOWED_NAMES') #allowed_usernames = json.loads(original_allowed_usernames) original_allowed_usernames = os.getenv('ALLOWED_NAMES') original_allowed_usernames = original_allowed_usernames.strip() # JSON 파싱을 수행합니다. allowed_usernames = json.loads(original_allowed_usernames) def is_valid_username(username): return username in allowed_usernames st.title(':male-teacher: AI ROBLOX Tutor - Feedback') st.header(':two: Tutor for Feedack: Get feedbacks and suggestions on your own Roblox game codes!') user_id = st.text_input(label='Assigned ID.') if is_valid_username(user_id): st.write(f'ID: :violet[{user_id}]') purpose = st.text_input( label='Write the purpose of the code that you want to get feedback on.', placeholder='purpose of your code' ) st.write(f'Purpose: :violet[{purpose}]') eval = st.text_input( label='Write the code that you want to get feedback on.', placeholder='copy and paste syntax-based code script' ) st.write(f'Codes: :violet[{eval}]') query2 = "purpose: " + purpose + ". texted codes: " + eval query_2 = 'AT_TUTOR_2: ' + query2 # 이미지 입력 image_uploaded2 = st.file_uploader("OPTIONAL: Upload an image of the code that you want to get feedback on", type=["png", "jpg", "jpeg"]) def evaluator_persona_query(eval, purpose, image_data=None): import openai openai.api_key = OPENAI_API_KEY VISION_PROMPT_MESSAGES = [ { "role": "system", "content": "Your role: You are a tutor who gives feedback about the Roblox code made with a Roblox plugin called Blocklua. Situation: A student is using a plugin called Blocklua to program using block-based code. The student ask for corrective and explanatory feedback of their own code of the Roblox games of their own, sometimes including images. What to do: If they ask you to give feedback and suggestion about the code they uploaded or the code in the image, give them the corrective or explanatory feedback and suggestion based on the aspect of Algorithm & procedures, Automation logic, perfection. PERCEIVE the code the user enetered as it is, and NEVER change it until the code suggestion. " ##CSTA & ISTE (2011). Computational Thinking in K-12 education – teacher resources, 2nd edition, CSTA & ISTE }, {"role": "user", "content": "Read and find the meaning of the code in the image and text and evaluate the code. purpose of the code: "+ purpose + "code to be analysed: " + eval}, ] if image_data is not None: encoded_image = base64.b64encode(image_data).decode("utf-8") VISION_PROMPT_MESSAGES.append({"role": "user", "content": encoded_image}) params = { "model": "gpt-4o-mini", "messages": VISION_PROMPT_MESSAGES, "max_tokens": 3000, # 1024, } trimmed_answer = "" # trimmed_answer 초기화 try: full_answer = openai.chat.completions.create(**params) trimmed_answer = full_answer.choices[0].message.content except Exception as e: print(f"Error: {e}") trimmed_answer = f"Error: {e}" # 오류 메시지를 trimmed_answer에 할당 return trimmed_answer # 버튼 클릭 button2 = st.button(':sparkles: suggestions :sparkles:') def save_message(user_id, message, timestamp=None): if timestamp is None: timestamp = datetime.datetime.now() # datetime 객체를 DynamoDB 지원 타입으로 변환 if isinstance(timestamp, datetime.datetime): timestamp = int(timestamp.timestamp()) # Unix 타임스탬프(초 단위 정수)로 변환 table.put_item( Item={ 'UserID': user_id, 'Timestamp': timestamp, 'Message': message } ) if button2: eval = eval save_message(user_id, query_2) if image_uploaded2 is not None: image_data = image_uploaded2.read() answer = evaluator_persona_query(eval, purpose, image_data) else: answer = evaluator_persona_query(eval, purpose) answer_2 = 'AT_TUTOR_2: ' + answer save_message(user_id, answer_2) st.write(f'{answer}') else: st.warning("Invalid username. Please enter a valid username.")