naonauno's picture
Update app.py
e106f51 verified
raw
history blame
5.58 kB
import gradio as gr
import re
from typing import List, Dict
from datetime import datetime
class MissionGenerator:
def __init__(self):
self.mission_counter = 1
self.keywords = {
'main': [
'must', 'need to', 'primary', 'main goal', 'objective is to',
'task is to', 'have to', 'required to'
],
'secondary': [
'optional', 'can also', 'bonus', 'additional', 'extra',
'if possible', 'could also', 'might also'
],
'alternative': [
'alternatively', 'another way', 'or', 'instead',
'different approach', 'other option', 'different way'
]
}
def extract_objectives(self, text: str) -> List[Dict]:
sentences = [s.strip() for s in re.split(r'[.!?]+', text) if s.strip()]
objectives = []
for sentence in sentences:
sentence_lower = sentence.lower()
# Determine objective type based on keywords and sentence position
obj_type = 'Main' # Default to Main for first sentence if no other indicators
if any(kw in sentence_lower for kw in self.keywords['alternative']):
obj_type = 'Alternative'
elif any(kw in sentence_lower for kw in self.keywords['secondary']):
obj_type = 'Secondary'
elif any(kw in sentence_lower for kw in self.keywords['main']) or not objectives:
obj_type = 'Main'
# Clean up the sentence
clean_sentence = sentence
for keyword_list in self.keywords.values():
for kw in keyword_list:
clean_sentence = re.sub(rf'\b{kw}\b', '', clean_sentence, flags=re.IGNORECASE)
# Further cleanup
clean_sentence = re.sub(r'^[\s,]+|[\s,]+$', '', clean_sentence)
clean_sentence = clean_sentence.strip()
if clean_sentence:
# Create identifier from key words
words = re.findall(r'\b\w+\b', clean_sentence.lower())
identifier = '_'.join(words[:2])
objectives.append({
'type': obj_type,
'identifier': identifier,
'description': clean_sentence
})
return objectives
def generate_response(self, user_input: str) -> tuple[str, str]:
objectives = self.extract_objectives(user_input)
# Generate formatted output
output = f"# M{self.mission_counter}\n"
for obj in objectives:
output += f"Add {obj['type']} {obj['identifier']}\n"
output += f"- {obj['description']}\n"
# Check for silent/suppress keywords
if any(word in user_input.lower() for word in ['silently', 'quietly', 'without notification', "don't notify"]):
output += "Dnd\n"
output += "#\n"
# Generate chat response
chat_response = f"I've created {len(objectives)} objectives based on your description. "
if objectives:
types = [obj['type'] for obj in objectives]
chat_response += f"This includes {', '.join(f'{t.lower()} objectives' for t in set(types))}. "
chat_response += "Would you like to modify any of them?"
return chat_response, output
def create_gradio_interface():
generator = MissionGenerator()
def process_input(user_input: str, history: List[Dict]) -> tuple[List[Dict], str]:
chat_response, formatted_output = generator.generate_response(user_input)
history.append({"role": "user", "content": user_input})
history.append({"role": "assistant", "content": chat_response})
return history, formatted_output
with gr.Blocks() as interface:
gr.Markdown("""
# Original War Mission Objective Generator
Describe your mission scenario and I'll help you create formatted mission objectives.
Try phrases like "The player must...", "They can optionally...", or "Alternatively..."
""")
chatbot = gr.Chatbot(height=400, type="messages")
msg = gr.Textbox(
label="Describe your mission scenario",
placeholder="Describe what the player needs to do..."
)
clear = gr.Button("Clear Conversation")
formatted_output = gr.Textbox(
label="Generated Mission Objectives",
lines=10,
placeholder="Mission objectives will appear here..."
)
msg.submit(process_input,
inputs=[msg, chatbot],
outputs=[chatbot, formatted_output])
clear.click(lambda: ([], ""), outputs=[chatbot, formatted_output])
gr.Examples(
examples=[
"The player must infiltrate the enemy base. They can optionally rescue prisoners along the way. Alternatively, they could create a diversion at the front gate.",
"Protect the convoy until it reaches the destination. You can also secure supply drops if possible.",
"Your main goal is to capture the strategic point. Alternatively, try negotiating with the local faction silently.",
],
inputs=msg
)
return interface
# Launch the interface
if __name__ == "__main__":
iface = create_gradio_interface()
iface.launch()