import gradio as gr from code import ( parse_speaker_text, analyze_all_speakers, stream_response ) from config import model, tokenizer, label_mapping def generate_scenario(api_key, conversation_data, scenario_str): """대화 데이터와 시나리오 설명을 받아 완성된 시나리오를 생성하는 함수""" try: # 입력 데이터 검증 if not api_key.strip(): return "❌ API 키를 입력해주세요." if not conversation_data.strip(): return "❌ 대화 데이터를 입력해주세요." if not scenario_str.strip(): return "❌ 시나리오 상황을 입력해주세요." # 화자 딕셔너리 생성 speaker_dict = parse_speaker_text(conversation_data) if not speaker_dict: return "❌ 대화 데이터 형식이 올바르지 않습니다. '번호: 발화내용' 형식으로 입력해주세요." # Big5 분석 predicted_big5 = analyze_all_speakers(speaker_dict, model, tokenizer, label_mapping) # 시나리오 생성 요청 프롬프트 구성 user_content = f""" **분석 데이터:** - 대화 데이터: {conversation_data} - Big5 점수: {predicted_big5} - 시나리오 상황: {scenario_str} **요청 사항:** 등장 인물의 이름은 입력한 대화 데이터를 그대로 사용하고, 새로운 이름을 부여하지 마세요. 각 등장 인물의 Big5 점수를 참고하여 각자의 성격이 극명하게 드러나도록 해주세요. 대화에서 파악한 등장인물 사이의 관계를 반영해주세요. 한 시나리오 안에서 이야기를 완결시켜 한 scene을 완성해주세요. 위 데이터를 바탕으로 10-15턴의 대화 시나리오를 다음 형식으로 생성해주세요: 씬 제목: [제목] - 시간: [시간] - 장소: [장소] - 등장인물: [인물들과 성격 특징] (장면 설명) 인물1: "대사" 인물2: "대사" ... """ # 시나리오 생성 generated_scenario = stream_response(user_content, api_key) return generated_scenario except Exception as e: return f"❌ 처리 중 오류가 발생했습니다: {str(e)}" # Gradio 인터페이스 정의 (모든 Flag 관련 파라미터 제거) iface = gr.Interface( fn=generate_scenario, inputs=[ gr.Textbox( label="🔑 Anthropic API Key", type="password", placeholder="sk-ant-api03-..." ), gr.Textbox( label="💬 Conversation Data", lines=10, placeholder="""대화 데이터를 다음 형식으로 입력하세요: 1: 안녕하세요, 오늘 회의 준비는 잘 되셨나요? 2: 네, 거의 다 준비했습니다. 다만 마지막 부분이 조금 걱정이네요. 1: 괜찮습니다. 함께 검토해보죠.""", value = """1 : 얼마 전에 동네 피부 미용샵에 다녀왔어요! 여기 좋더라고요! 2 : 동네에 그런 곳이 있어요? 3 : 아 그 사거리에 있는 거 맞죠? 1 : 네 맞아요! 확실히 개인 미용샵이다 보니까 사람도 별로 없고 피부랑 눈썹이랑 정말 꼼꼼히 봐주셨어요 2 : 요새 피부 관리를 정말 못했는데 저도 한 번 가봐야겠어요 3 : 오오 눈썹! 전 화장할 때 눈썹을 제일 중요하게 여기는데 원래 제 눈썹을 관리하기가 힘들더라고요 1 : 음~ 그럼 거기 가보세요! 1 : 눈썹 문신도 하시더라고요 2 : 정말 한 번 가볼게요! 알려줘서 감사해요 하하 3 : 아 혹시 쌍커풀 수술 하신 분 계세요? 1 : 저는 자연이요! 1 : 왜요 왜요 관심 있어요? 2 : 오~ 쌍커풀 수술 하고 싶어요? 3 : 하하 그건 아니고, 제가 속눈썹이 말려서 자라서 안과 선생님께서 권하시더라고요 1 : 아~ 속눈썹 말려 자라는 분 꽤 있더라고요 2 : 오오 그럼 수술하는 거에요? 3 : 사실 전 아직 생각 없어요 키키 3 : 속쌍커풀이 있어서 살 빼면 겉쌍커풀 생길 수 있다고 엄마도 반대하셨어요 1 : 그래요! 사실 다이어트가 최고의 성형이라잖아요 2 : 아! 제 친구가 이번에 필러를 맞았는데 조금 부자연스럽더라고요 3 : 저희 엄마도 한 번쯤은 보톡스나 필러 맞아보고 싶다고 하셨는데... 1 : 저도 후기 많이 들었는데 초반에는 부자연스러워도 점점 붓기 빠지면 만족스러워 하던데요 2 : 그래서 한 번 맞으면 계속 맞게 된다고 하나봐요 3 : 키키 그런가 봐요! 3 : 나중에 돈 많이 벌면 과도하지 않은 선에서 몇 번 맞춰드릴까 생각 중이에요 1 : 하하 좋은 생각이에요! 1 : 요새 이런 건 흔한 시술이니까! 2 : 맞아요! 젊은 친구들도 정말 많이 하더라고요 3 : 음 그런 것 같아요! 3 : 제 친구들 중에서도 필러 맞은 친구들이 꽤 있거든요 """ ), gr.Textbox( label="🎬 Scenario Description", lines=2, placeholder="예: 회의 직전에 팀원들끼리의 갈등 상황", value="팀플 마감 하루 전, 한 명이 '나 이번 주 바빴어'라며 자료를 아무것도 안 가져온 상황. 가장 책임감이 강한 사람이 자료를 가져오지 않은 사람을 탓한다." ) ], outputs=gr.Textbox(label="📄 Generated Scenario", lines=25), title="📝 성격 기반 대화 시나리오 생성기", description="대화 데이터를 기반으로 Big5 성격 분석 후, 주어진 시나리오 상황에 맞는 완결된 장면을 생성합니다.", flagging_mode="never" ) if __name__ == "__main__": print("🚀 성격 기반 대화 시나리오 생성기를 시작합니다...") print("💡 Anthropic API 키는 https://console.anthropic.com에서 발급받을 수 있습니다.") iface.launch(share=True)